Дополнительно
Программно перемещайтесь с помощью реактивного маршрутизатора
С помощью react-router
я могу использовать элемент Link
для создания ссылок, которые изначально обрабатываются маршрутизатором react.
Я вижу внутри это называется this.context.transitionTo (...)
.
Я хочу сделать навигацию, но не по ссылке, например, из выпадающего списка. Как я могу сделать это в коде? Что такое this.context
?
Я видел миксин "Навигация", но могу ли я сделать это без миксинов?
1245
30
В React Router > 5.1.0 появился новый крючок «useHistory», если вы используете React > 16.8.0 и функциональные компоненты.
С v4 React Router есть три подхода, которые вы можете использовать для программной маршрутизации внутри компонентов.
withRouter
высшего порядка.< Route >
context
.React Router - это в основном оболочка вокруг библиотеки
history
.history
обрабатывает взаимодействие с браузеромwindow.history
для вас с его браузером и историями хешей. Он также предоставляет историю памяти, которая полезна для сред, которые не имеют глобальной истории. Это особенно полезно при разработке мобильных приложений (react-native
) и модульном тестировании с помощью Node.Экземпляр
history
имеет два метода навигации:push
иreplace
. Если вы рассматриваете «историю» как массив посещенных местоположений, «push» добавит новое местоположение в массив, а «заменить» заменит текущее местоположение в массиве новым. Обычно вы хотите использовать методpush
при навигации.В более ранних версиях React Router вам приходилось создавать свой собственный экземпляр
history
, но в v4 -< BrowserRouter >
,< HashRouter >
и< MemoryRouter >
компоненты создадут браузер, хэш и экземпляры памяти для вас. React Router делает свойства и методы экземпляраhistory
, связанного с вашим маршрутизатором, доступными через контекст под объектомrouter
.1. Используйте компонент
withRouter
высшего порядкаКомпонент
withRouter
высшего порядка будет вводить объектhistory
как опору компонента. Это позволяет получить доступ к методам «push» и «заменить» без необходимости иметь дело с «контекстом».2. Используйте композицию и визуализируйте
< Route >
Компонент
< Route >
предназначен не только для сопоставления местоположений. Вы можете визуализировать бездорожный маршрут, и он всегда будет соответствовать текущему местоположению . Компонент< Route >
проходит те же реквизиты, что иwithRouter
, поэтому вы сможете получить доступ к методамhistory
через опоруhistory
.3. Используйте контекст *
Но вы, вероятно, не должны
Последний вариант - тот, который вы должны использовать, только если вам удобно работать с моделью React context. Хотя контекст является вариантом, следует подчеркнуть, что контекст является нестабильным API, и у React есть раздел Почему не использовать контекст в их документации. Так что используйте на свой страх и риск!
1 и 2 - самый простой выбор для реализации, поэтому для большинства случаев использования они являются вашими лучшими ставками.
& Лт; br / > Кроме того, вы можете получить больше знаний по нижним ссылкам о маршрутизации, параметрах URL и вложенной маршрутизации.
Маршрутизация в React JS < br / >
Параметры URL с помощью React Router < br / >
Вложенные маршруты в React JS < br / >
Надеюсь, это поможет вам!
Вы можете использовать новый крючок
useHistory
для функциональных компонентов и программно перемещаться:В 4.0 и выше используйте историю как опору вашего компонента.
ПРИМЕЧАНИЕ: this.props.history не существует в случае, если ваш компонент не был представлен
< Route >
. Вы должны использовать< Маршрут пути = "..."component = {YourComponent} / >
иметь этот.props.history в YourComponentВ 3.0 и выше используйте маршрутизатор в качестве опоры вашего компонента.
В пунктах 2.4 и выше используйте компонент более высокого порядка, чтобы получить маршрутизатор в качестве опоры вашего компонента.
Эта версия обратно совместима с 1.x, поэтому нет необходимости в Руководстве по обновлению. Просто пройти через примеры должно быть достаточно хорошо.
Тем не менее, если вы хотите переключиться на новый шаблон, внутри маршрутизатора есть модуль browserHistory, к которому вы можете получить доступ
import {browserHistory} из 'react-router'
Теперь у вас есть доступ к истории вашего браузера, поэтому вы можете делать такие вещи, как push, map и т. Д... Подобно:
browserHistory.push ('/ some/path')
Дальнейшее чтение: Истории и Навигация
Я не буду вдаваться в подробности обновления. Об этом вы можете прочитать в Руководстве по обновлению
Основное изменение в вопросе здесь - переход от навигационного миксина к истории. Теперь он использует историю браузера API для изменения маршрута, поэтому мы будем использовать
pushState ()
отныне.Вот пример с использованием Mixin:
Обратите внимание, что эта «История» происходит из проекта rackt / history. Не от самого React-Router.
Если вы по какой-то причине не хотите использовать Mixin (возможно, из-за класса ES6), вы можете получить доступ к истории, которую вы получаете от маршрутизатора, из
this.props.history
. Он будет доступен только для компонентов, представленных вашим маршрутизатором. Итак, если вы хотите использовать его в каких-либо дочерних компонентах, его необходимо передать как атрибут черезprops
.Вы можете прочитать больше о новом выпуске в их 1.0.x документации
Вот страница справки, конкретно касающаяся навигации за пределами вашего компонента
Он рекомендует взять ссылку
history = createHistory ()
и вызватьreplaceState
на этом.Я столкнулся с той же проблемой и смог найти решение только с навигационным миксином, который поставляется с реактивным маршрутизатором.
Вот как я это сделал
Я смог вызвать
transitionTo ()
без необходимости доступа.context
Или вы можете попробовать модный ES6
class
React-Router-Redux имеет несколько доступных методов, которые позволяют легко перемещаться от создателей внутренних действий. Они могут быть особенно полезны для людей, которые имеют существующую архитектуру в React Native, и они хотят использовать те же шаблоны в React Web с минимальными накладными расходами на шаблон.
Изучите следующие методы:
push (местоположение)
заменить (местоположение)
go (число)
GoBack ()
goForward ()
Вот пример использования с Redux-Thunk:
./actioncreators.js
./viewcomponent.js
Для самого последнего выпуска (
v2.0.0-rc5
) рекомендуемый метод навигации заключается в непосредственном переходе к истории синглтон. Вы можете видеть это в действии в < a href = "https://github.com/rackt/react-router/blob/master/docs/guides/NavigatingOutsideOfComponents.md"> Навигация вне компонентов doc < / a >.Соответствующий отрывок:
При использовании более нового API-интерфейса react-router вам необходимо использовать
history
изthis.props
, когда внутри компонентов так:Он также предлагает
pushState
, но это не рекомендуется для зарегистрированных предупреждений.При использовании
react-router-redux
он предлагает функциюpush
, которую вы можете отправить следующим образом:Однако это может использоваться только для изменения URL-адреса, а не для перехода на страницу.
Вот как вы делаете это с
react-router v2.0.0
с [ES6] ( http://babeljs.io/blog/2015/06/07/reacton. «Реактивный роутер» отошел от миксинов.С моей стороны, мне нравится иметь один объект истории, который я могу нести даже за пределами компонентов. Что мне нравится делать, так это иметь один файл history.js, который я импортирую по требованию, и просто манипулировать им.
Вам просто нужно изменить
BrowserRouter
на Router и указать опору истории. Это ничего не меняет для вас, кроме того, что у вас есть свой собственный объект истории, которым вы можете манипулировать по своему усмотрению.Вам необходимо установить history, библиотеку, используемую
react-router
.Пример использования, обозначение ES6:
history.js
BasicComponent.js
Если вам нужно перейти от компонента, который фактически отображается из компонента
Route
, вы также можете получить доступ к истории из реквизита, например:BasicComponent.js
Для этого, кто не контролирует сторону сервера и из-за этого использует хэш-маршрутизатор v2:
Поместите свою историю в отдельный файл (например,. app_history.js ES6):
И использовать его везде!
Ваша точка входа для react-router (app.js ES6):
Ваша навигация внутри любого компонента (ES6):
tl: dr ;
Простой и декларативный ответ заключается в том, что вам нужно использовать
< Перенаправить на = {URL} push = {boolean} / >
в сочетании сsetState ()
Полный пример здесь. Читать дальше здесь.
PS. В примере используется ES7 + Инициализаторы свойств для инициализации состояния. Посмотрите здесь, если вам интересно.
Вы можете сделать это без миксинов тоже.
По сути, это то, что он недоступен, если вы не определите «contextTypes» в классе.
Что касается контекста, то это объект, подобный реквизиту, который передается от родителя к ребенку, но он передается неявно, без необходимости каждый раз повторять реквизит реквизиты. См. https://www.tildedave.com/2014/11/15/introduction-to-contexts-in-react-js.html
Я попробовал как минимум 10 способов сделать это, прежде чем что-то сработало правильно!
Ответ @Felipe Skinner
withRouter
был для меня немного ошеломляющим, и я не был уверен, что хочу делать новые названия классов "ExportedWithRouter".Вот самый простой и чистый способ сделать это, около текущих React-Router 3.0.0 и ES6:
или, если это не ваш класс по умолчанию, экспортировать как:
Обратите внимание, что в 3.x.x сам компонент
< Link >
используетrouter.push
, поэтому вы можете передать его всем, что вы передадите тег< Link to =
, например:Чтобы выполнить навигацию программно, вам нужно нажать новую history на props.history в вашем
component
, чтобы что-то подобное могло сделать работу за вас:Может быть не лучший подход, но... Используя react-router v4, следующий Typescript может дать представление для некоторых.
В визуализированном компоненте ниже, например,.
LoginPage
, объектrouter
доступен и просто вызывайтеrouter.transitionTo ('/ homepage')
для навигации.Код навигации был взят из.
"react-router": "^ 4.0.0-2",
"react": "^ 15.3.1",
& Лт;!- начать фрагмент: js hide: ложная консоль: истинная павиана: false - >
& Лт;!- конец фрагмента - >
Для компонентов ES6 + React для меня работало следующее решение.
Я последовал за Фелиппе Скиннером, но добавил комплексное решение, чтобы помочь начинающим, как я.
Ниже приведены версии, которые я использовал:
Ниже мой компонент реагирования, где я использовал программную навигацию с помощью реактивного маршрутизатора:
Ниже приведена конфигурация для моего маршрутизатора:
Вы можете использовать
withRouter
иthis.props.history.push
.Чтобы использовать
withRouter
с компонентом на основе классов, попробуйте что-то подобное ниже. Не забудьте изменить экспортную выписку, чтобы использоватьwithRouter
:import {withRouter} из 'react-router-dom'
на основании предыдущего ответа от Jos & # 233; Антонио Постиго и Бен Уилер новинка? должен быть написан на Typescript и использование декораторов ИЛИ статическое свойство / поле
с любым npm, установленным сегодня. "react-router": "^ 3.0.0" и "@ types / react-router": "^ 2.0.41"
В реакте роутер v4. Я следую этим двум путям к программному маршруту.
Номер два
Чтобы получить историю в реквизите, вам, возможно, придется обернуть свой компонент
с React-Router v4 на горизонте, теперь есть новый способ сделать это.
react-lego - это пример приложения, который показывает [как использовать / обновить react-router](https://github.com/peter- mouland / react-lego/compare/react-router-4) и включает в себя примеры функциональных тестов, которые перемещаются в приложении.
Если вы используете историю хэша или браузера, вы можете это сделать
С текущей версией React (15.3)
this.props.history.push ('/ location');
работал для меня, но он показал следующее предупреждение:и я решил это, используя
context.router
, как это:React-Router V4
если вы используете версию 4, вы можете использовать мою библиотеку (бесстыдный плагин), где вы просто отправляете действие, и все просто работает!
Трипплер