Программируем переходы
ОБНОВЛЕНИЕ 2018: в учебнике хорошая теория, но ему уже два года. Проверяйте версии пакетов. За выходом нового учебника можно следить в telegram канале или twitter
На канале так же проводятся бесплатные вебинары, публикуются переводы и авторские материалы, присоединяйтесь!
Программируем переходы
(конечно, дело касается "переходов по ссылкам")
Давайте рассмотрим очень "выдуманный пример":
На главной странице у нас есть форма, в которой мы можем написать любой жанр. По кнопке - перейти - мы попадаем по адресу:
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>
)
}
}Все предельно прозрачно: мы использовали browserHistory API, просто "пушнув" (pushState) новую запись в историю.
Замечание: browserHistory из react-router, использует библиотеку history, которая в свою очередь использует возможности современных браузеров.
Если мы передадим значение rock - по клику на кнопку нас "перебросит" на:
http://localhost:3000/genre/rock
Вопрос валидации здесь не важен, так как цель данного урока не в этом.
Важно отметить, что если вы передадите историю в роутер, отличную от того, что используется здесь - приложение сломается. Честно говоря, на практике я не встречался с такой проблемой, но мне нравится ее решение, которое приводится в официальной документации (ES5 синтаксис).
Использование this.context для программной навигации
src/components/Home/index.js
Так как, в будущем мы еще столкнемся с использованием this.context.router и так как этот вариант является пуленепробиваемым - давайте оставим его.
У меня есть парочка вопросов на знание экосистемы react'a.
Зачем используется
this.handleSubmit = this.handleSubmit.bind(this)?Будет ли работать
this.context.router.pushесли убрать последние три строки (там где проверяются props) ?
Ответы:
React с версии 0.14 (предыдущей, перед 15.0) не использует автобиндинг если используются ES2015 классы. Мы должны забиндить this явно.
Работать не будет, так как
this.contextможно использовать только при наличии проверки contextTypes.
Итого: мы можем программно перенаправить браузер пользователя на новый URL. Мы научились использовать this.context используя "классический" (от слова "класс") синтаксис ES2015.
Исходный код на данный момент.
Last updated
Was this helpful?