react-router-course-ru
  • Вступление
  • Подготовка
    • Настраиваем dev-окружение
  • Создаем примитивный роутер
  • Подключаем react-router
    • BrowserHistory vs HashHistory
    • Дописываем роуты
    • Активная ссылка
      • Ссылка на главную
    • IndexRedirect
    • Программируем переходы
    • Разделение доступа
    • Подтверждение перехода
    • Итого по роутингу
  • Подключаем redux
    • store.dispatch редирект
    • "Закрытый" компонент
    • Итого по react-router + redux
Powered by GitBook
On this page
  • Программируем переходы
  • Использование this.context для программной навигации

Was this helpful?

  1. Подключаем react-router

Программируем переходы

PreviousIndexRedirectNextРазделение доступа

Last updated 5 years ago

Was this helpful?

ОБНОВЛЕНИЕ 2018: в учебнике хорошая теория, но ему уже два года. Проверяйте версии пакетов. За выходом нового учебника можно следить в или

На так же проводятся бесплатные вебинары, публикуются переводы и авторские материалы, !

Программируем переходы

(конечно, дело касается "переходов по ссылкам")

Давайте рассмотрим очень "выдуманный пример":

На главной странице у нас есть форма, в которой мы можем написать любой жанр. По кнопке - перейти - мы попадаем по адресу:

http://localhost:3000/genre/жанр_из_формы/

Динамический роут /genre/:genre - как раз позволит нам это.

Практической пользы в этом никакой, но так мы рассмотрим переходы "программно" на деле.

Реальная задача вас ждет уже в следующей главе, но мне бы хотелось, чтобы после решения данного выдуманного примера вы с легкостью решили ее самостоятельно.

Приступим:

src/components/Home/index.js

import React, { Component } from 'react'
import { browserHistory } from 'react-router'

export default class Home extends Component {
  handleSubmit(e) {
    e.preventDefault()
    const value = e.target.elements[0].value.toLowerCase()
    browserHistory.push(`/genre/${value}`)
  }
  render() {
    return (
      <div className='row'>
        <div className='col-md-12'>Раздел /</div>
        <form className='col-md-4' onSubmit={this.handleSubmit}>
          <input type='text' placeholder='genreName'/>
          <button type='submit'>Перейти</button>
        </form>
      </div>
    )
  }
}

Если мы передадим значение rock - по клику на кнопку нас "перебросит" на:

http://localhost:3000/genre/rock

Вопрос валидации здесь не важен, так как цель данного урока не в этом.

Использование this.context для программной навигации

src/components/Home/index.js

import React, { Component, PropTypes } from 'react'

export default class Home extends Component {
  constructor() {
    super();
    this.handleSubmit = this.handleSubmit.bind(this)
  }
  handleSubmit(e) {
    e.preventDefault()
    const value = e.target.elements[0].value.toLowerCase()
    this.context.router.push(`/genre/${value}`)
  }
  render() {
    return (
      <div className='row'>
        <div className='col-md-12'>Раздел /</div>
        <form className='col-md-4' onSubmit={this.handleSubmit}>
          <input type='text' placeholder='genreName'/>
          <button type='submit'>Перейти</button>
        </form>
      </div>
    )
  }
}

Home.contextTypes = {
  router: PropTypes.object.isRequired
}

Так как, в будущем мы еще столкнемся с использованием this.context.router и так как этот вариант является пуленепробиваемым - давайте оставим его.

У меня есть парочка вопросов на знание экосистемы react'a.

  1. Зачем используется this.handleSubmit = this.handleSubmit.bind(this) ?

  2. Будет ли работать this.context.router.push если убрать последние три строки (там где проверяются props) ?

Ответы:

  1. React с версии 0.14 (предыдущей, перед 15.0) не использует автобиндинг если используются ES2015 классы. Мы должны забиндить this явно.

  2. Работать не будет, так как this.context можно использовать только при наличии проверки contextTypes.

Итого: мы можем программно перенаправить браузер пользователя на новый URL. Мы научились использовать this.context используя "классический" (от слова "класс") синтаксис ES2015.

Все предельно прозрачно: мы использовали browserHistory API, просто "" (pushState) новую запись в историю.

Замечание: browserHistory из react-router, использует библиотеку , которая в свою очередь использует .

Важно отметить, что если вы передадите историю в роутер, отличную от того, что используется здесь - приложение сломается. Честно говоря, на практике я не встречался с такой проблемой, но мне нравится ее решение, которое приводится в (ES5 синтаксис).

на данный момент.

telegram канале
twitter
канале
присоединяйтесь
пушнув
history
возможности современных браузеров
официальной документации
Исходный код