С помощью react-router
я могу использовать Link
элемент для создания ссылок, которые изначально обрабатываются реагирующим маршрутизатором.
Я вижу внутренне это звонки this.context.transitionTo(...)
.
Я хочу сделать навигацию. Не по ссылке, а из выпадающего списка (как пример). Как я могу сделать это в коде? Что такое this.context
?
Я видел Navigation
миксин, но могу ли я сделать это без mixins
?
reactjs
react-router
Джордж Мауэр
источник
источник
Ответы:
В
useHistory
React Router> 5.1.0 появился новый хук, если вы используете React> 16.8.0 и функциональные компоненты.В версии 4 React Router существует три подхода к программной маршрутизации внутри компонентов.
withRouter
компонент высшего порядка.<Route>
context
.React Router - это в основном оболочка
history
библиотеки.history
обрабатывает взаимодействие с браузеромwindow.history
для вас с его браузером и историей хэшей. Он также предоставляет историю памяти, которая полезна для сред, в которых нет глобальной истории. Это особенно полезно при разработке мобильных приложений (react-native
) и модульном тестировании с Node.history
Экземпляр имеет два метода для навигации:push
иreplace
. Если вы рассматриваетеhistory
массив как посещенные местоположения,push
добавите новое местоположение в массив иreplace
замените текущее местоположение в массиве новым. Как правило, вы захотите использоватьpush
метод при навигации.В более ранних версиях Реагировать маршрутизатор, нужно было создать свой собственный
history
экземпляр, но в v4<BrowserRouter>
,<HashRouter>
и<MemoryRouter>
компоненты будет создавать браузер, хэш, и экземпляры памяти для вас. React Router делает свойства и методыhistory
экземпляра, связанного с вашим маршрутизатором, доступными через контекст подrouter
объектом.1. Используйте
withRouter
компонент высшего порядкаКомпонент
withRouter
высшего порядка будет вводитьhistory
объект как опору компонента. Это позволяет получить доступ кpush
иreplace
методам без необходимости иметь дело сcontext
.2. Используйте композицию и визуализируйте
<Route>
<Route>
Компонент не только для местоположений соответствия. Вы можете отобразить маршрут без маршрута, и он всегда будет соответствовать текущему местоположению .<Route>
Компонент проходит тот же реквизит , какwithRouter
, так что вы сможете получить доступ кhistory
методам черезhistory
опору.3. Используйте контекст *
Но вы, вероятно, не должны
Последний вариант - тот, который вам следует использовать только в том случае, если вы чувствуете себя комфортно в работе с контекстной моделью React (API контекста React стабилен начиная с версии 16).
1 и 2 - самый простой вариант реализации, поэтому в большинстве случаев они - ваши лучшие ставки.
источник
withRouter
вместо передачиhistory
через все мои компоненты? Мне нужно больше времени проводить за чтением документов ...history.push('/new-location')
не привязывая это поведение к кнопке или другому элементу DOM?Unexpected use of 'history' no-restricted-globals
context
больше не является экспериментальным по реакции 16.Вы можете использовать новый
useHistory
хук на функциональных компонентах и программно перемещаться:В версии 4.0 и выше используйте историю как опору вашего компонента.
ПРИМЕЧАНИЕ: this.props.history не существует, если ваш компонент не был обработан
<Route>
. Вы должны использовать,<Route path="..." component={YourComponent}/>
чтобы иметь this.props.history в YourComponentВ версии 3.0 и выше используйте маршрутизатор в качестве опоры для вашего компонента.
В версии 2.4 и выше используйте компонент более высокого порядка, чтобы получить маршрутизатор в качестве опоры для вашего компонента.
Эта версия обратно совместима с 1.x, поэтому нет необходимости в Руководстве по обновлению. Просто пройтись по примерам должно быть достаточно хорошо.
Тем не менее, если вы хотите переключиться на новый шаблон, внутри маршрутизатора есть модуль browserHistory, к которому вы можете получить доступ с помощью
import { browserHistory } from 'react-router'
Теперь у вас есть доступ к истории браузера, поэтому вы можете выполнять такие операции, как push, replace и т. Д.
browserHistory.push('/some/path')
Дальнейшее чтение: истории и навигация
Я не буду вдаваться в детали обновления. Вы можете прочитать об этом в Руководстве по обновлению.
Основное изменение в этом вопросе - это переход от Mixin навигации к истории. Теперь он использует историю браузера API для изменения маршрута, поэтому мы будем использовать его с этого момента
pushState()
.Вот пример использования Mixin:
Обратите внимание, что это
History
происходит из проекта 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(location)
replace(location)
go(number)
goBack()
goForward()
Вот пример использования с Redux-Thunk :
./actioncreators.js
./viewcomponent.js
источник
v2.4.0
но упомянутый подход не работает для меня, мое приложение вообще не рендерится и выводит консоль:Uncaught TypeError: (0 , _reactRouter.withRouter) is not a function
вот ссылка на мой пост SO: stackoverflow.com/questions/37306166/…2.6.0
.3.0.x
? Многие люди, кажется, используютcontext
способ.this.props.history
не существует, если ваш компонент не был обработан<Route>
. Вы должны использовать,<Route path="..." component={YourComponent}/>
чтобы иметьthis.props.history
вYourComponent
.Для самого последнего релиза (
v2.0.0-rc5
) рекомендуемый метод навигации заключается в прямом нажатии на одноэлементную историю. Это можно увидеть в действии в документе « Навигация за пределами компонентов» .Соответствующая выдержка:
Если вы используете более новый API реагирующего маршрутизатора, вам нужно использовать
history
from from,this.props
когда внутри компонентов, так:Это также предлагает,
pushState
но это устарело за зарегистрированные предупреждения.При использовании
react-router-redux
он предлагаетpush
функцию, которую вы можете отправить следующим образом:Однако это может использоваться только для изменения URL, а не для перехода на страницу.
источник
import { browserHistory } from './react-router'
а создает историю, используяimport createBrowserHistory from 'history/lib/createBrowserHistory'
. Позже, вы можете получить доступhistory
из компонентов реквизита:this.props.history('/some/path')
var browserHistory = require('react-router').browserHistory; browserHistory.goBack();
push
только изменяет URL, но фактически не меняет страницу. Чтобы сделать оба, импортироватьbrowserHistory
изreact-router
и использоватьbrowserHistory.push('/my-cool-path')
. К сожалению, это не очень легко найти. github.com/reactjs/react-router/blob/master/docs/guides/…react-router
v4Вот как вы делаете это
react-router v2.0.0
с ES6 .react-router
отошел от миксинов.источник
history
синглтон, как заявлено @Bobby. Вы можете использовать,context.router
но вы действительно затрудняете модульное тестирование этих компонентов, поскольку создание экземпляра только того компонента не будет иметь этого в контексте.С моей стороны, мне нравится иметь единственный объект истории, который я могу нести даже за пределами компонентов. Что мне нравится делать, так это иметь один файл history.js, который я импортирую по требованию, и просто манипулировать им.
Вам просто нужно перейти
BrowserRouter
на Router и указать реквизиты истории. Это ничего не меняет для вас, за исключением того, что у вас есть свой собственный объект истории, которым вы можете манипулировать, как хотите.Вам необходимо установить историю , используемую библиотеку
react-router
.Пример использования, обозначение ES6:
history.js
BasicComponent.js
Если вам нужно перейти от компонента, который фактически отображается из
Route
компонента, вы также можете получить доступ к истории из реквизита, например:BasicComponent.js
источник
Router
вместоBrowserRouter
.BrowserRouter
создает и поддерживаетhistory
объект для вас. Вы не должны по умолчанию создавать свои собственные, только если вы [«нуждаетесь в глубокой интеграции с такими инструментами управления состоянием, как Redux.» ) Acttraining.com/react-router/web/api/Routerthis.props.history
, я пока не нашел решения, которое могло бы помочь мне сделать такую вещь в классе, который не является компонентом или любым другим инструментом, который не создан как компонент React, для которого Вы можете передать реквизит. Спасибо за ваш отзыв :)Для этого, кто не контролирует серверную часть и из-за этого использует hash router v2:
Поместите свою историю в отдельный файл (например, app_history.js ES6):
И используйте это везде!
Ваша точка входа для реакции-маршрутизатора (app.js ES6):
Ваша навигация внутри любого компонента (ES6):
источник
history
любой из этих подходовТЛ: д-р;
Простой и декларативный ответ заключается в том, что вам нужно использовать
<Redirect to={URL} push={boolean} />
в сочетании сsetState()
Полный пример здесь . Узнайте больше здесь .
PS. В примере используются инициализаторы свойств ES7 + для инициализации состояния. Посмотри здесь , если тебе интересно.
источник
withRouter
не работало, когда уже на маршруте, который перезагружается. В нашем случае нам пришлось выборочно делатьsetState
(вызываяreturn <Redirect>
), если уже на маршруте илиhistory.push()
из другого места.Вы можете сделать это и без миксинов.
Суть в том, что он недоступен, если вы не определили
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.xx сам
<Link>
компонент используетrouter.push
, так что вы можете передать ему все, что вы передадите<Link to=
тегу, например:источник
200 OK
вместо30x
кода. Как я могу исправить эту проблему?Чтобы выполнить навигацию программным способом , вам нужно добавить новую историю в props.history в вашей папке
component
, чтобы что-то вроде этого могло помочь вам:источник
Для компонентов ES6 + React у меня сработало следующее решение.
Я последовал за Фелиппом Скиннером, но добавил комплексное решение, чтобы помочь таким начинающим, как я.
Ниже приведены версии, которые я использовал:
Ниже приведен мой компонент реакции, где я использовал программную навигацию с использованием реагирующего маршрутизатора:
Ниже приведена конфигурация для моего маршрутизатора:
источник
Возможно, это не лучший подход, но ... С помощью response-router v4 следующий Typescript может дать представление для некоторых.
В представленном ниже компоненте, например
LoginPage
,router
объект доступен и просто вызываетсяrouter.transitionTo('/homepage')
для навигации.Навигационный код был взят из .
"react-router": "^4.0.0-2",
"react": "^15.3.1",
источник
Вы можете использовать
withRouter
иthis.props.history.push
.источник
Чтобы использовать
withRouter
с компонентом на основе классов, попробуйте что-то вроде этого ниже. Не забудьте изменить оператор экспорта для использованияwithRouter
:import { withRouter } from 'react-router-dom'
источник
основываясь на предыдущем ответе
Хосе Антонио Постиго и Бена Уилера
о новизне? должен быть написан на Typescript
и использование декораторов
ИЛИ статическое свойство / поле
с любым установленным сегодня npm. «response-router»: «^ 3.0.0» и
«@ types / реагирующий маршрутизатор»: «^ 2.0.41»
источник
с React-Router v4 на горизонте, теперь есть новый способ сделать это.
response-lego - это пример приложения, которое показывает, как использовать / обновлять реактив-маршрутизатор, и включает примеры функциональных тестов, которые перемещаются по приложению.
источник
В реакции роутера v4. Я следую этому двухстороннему маршруту программно.
Номер два
Чтобы получить историю в реквизитах, вам, возможно, придется обернуть свой компонент с
источник
Если вы используете хеш или историю браузера, то вы можете сделать
источник
hashHistory.push
, дает не может прочитать свойство "push" из неопределенного. Откуда вы их импортируете?С текущей версией React (15.3)
this.props.history.push('/location');
у меня сработало, но показало следующее предупреждение:и я решил это с помощью
context.router
этого:источник
React-Router V4
если вы используете версию 4, то вы можете использовать мою библиотеку (плагин Shameless), где вы просто отправляете действие, и все просто работает!
trippler
источник
Те, кто сталкивается с проблемами в реализации этого на реакции-маршрутизатор v4.
Вот рабочее решение для навигации по приложению реагировать на редукционные действия.
history.js
App.js / Route.jsx
another_file.js ИЛИ редукционный файл
Все благодаря этому комментарию: ReactTraining выпускает комментарий
источник
Если случится с парой RR4 с редуксом черезact -router-redux , используйте
react-router-redux
вариант действий создателей маршрутизации от .Если для управления асинхронным потоком используется redux thunk / saga, лучше импортируйте вышеуказанные создатели действий в действиях redux и подключайте для реагирования компоненты, используя mapDispatchToProps.
источник
react-router-redux
давно устарел / архивированВы также можете использовать
useHistory
хук в компоненте без сохранения состояния. Пример из документов.источник
Правильный ответ был для меня на момент написания
Но вам нужно добавить PropTypes в ваш компонент
Не забудьте импортировать PropTypes
источник
Возможно, не лучшее решение, но оно выполняет свою работу:
По сути, логика, связанная с одним действием (в данном случае удаление сообщения), в итоге вызовет триггер для перенаправления. Это не идеально, потому что вы добавите триггер DOM-узла к вашей разметке, чтобы вы могли удобно вызывать его при необходимости. Кроме того, вы будете напрямую взаимодействовать с DOM, что в компоненте React может оказаться нежелательным.
Тем не менее, этот тип перенаправления не требуется так часто. Таким образом, одна или две дополнительные скрытые ссылки в разметке вашего компонента не повредят так сильно, особенно если вы дадите им значимые имена.
источник
Для меня это сработало, особого импорта не требовалось:
источник
history
добавленprops
сам по себе. Это происходит из HoC, который вам необходимо импортировать, чтобы использовать (компоненты, отправленные напрямуюRoute
, автоматически оборачиваются этим HoC, но затем вам нужен импорт дляRoute
...)вместо этого используйте hookrouter, современную альтернативу реакции-маршрутизатора
https://www.npmjs.com/package/hookrouter
чтобы ответить на вопрос OP о связывании через поле выбора, вы можете сделать это:
источник
Предполагая, что вам не нужно будет перемещаться во время самого начального рендера (для которого вы можете использовать
<Redirect>
компонент), это то, что мы делаем в нашем приложении.Определите пустой маршрут, который возвращает ноль, это позволит вам получить доступ к объекту истории. Вы должны сделать это на верхнем уровне, где ваш
Router
определяется.Теперь вы можете делать все, что можно сделать в истории, как
history.push()
,history.replace()
иhistory.go(-1)
т. Д!источник
response-router-dom: 5.1.2
Этот сайт имеет 3 страницы, все они динамически отображаются в браузере.
Хотя страница никогда не обновляется, обратите внимание, как React Router обновляет URL-адрес при переходе по сайту. Это сохраняет историю браузера, гарантируя, что такие вещи, как кнопка «Назад» и закладки работают правильно
Коммутатор просматривает все его дочерние элементы и делает первый , чей путь совпадает с текущим URL. Используйте любое время, когда у вас есть несколько маршрутов, но вы хотите, чтобы только один из них отображался одновременно
источник
Таким образом, в моем ответе есть 3 различных способа программного перенаправления на маршрут. Некоторые решения уже были представлены, но следующие ориентированы только на функциональные компоненты с дополнительным демонстрационным приложением.
Используя следующие версии:
Конфигурация:
Поэтому в первую очередь используется решение
HashRouter
, настроенное следующим образом:Из документации о
<HashRouter>
:Решения:
<Redirect>
чтобы нажать используяuseState
:Используя в функциональном компоненте (
RedirectPushAction
компонент из моего хранилища) мы можем использоватьuseState
для обработки перенаправления. Сложность в том, что как только произошло перенаправление, нам нужноredirect
вернуть состояние обратноfalse
. ИспользуяsetTimeOut
с0
задержкой, мы ждем, пока React совершитRedirect
выполнит в DOM, а затем возвращаем кнопку, чтобы использовать в следующий раз.Пожалуйста, найдите мой пример ниже:
Из
<Redirect>
документации:useHistory
крючок:В моем решении есть компонент,
UseHistoryAction
который называется следующим:withRouter
, получитьhistory
отprops
:Создан один компонент под названием
WithRouterAction
, отображается как показано ниже:Чтение из
withRouter
документации:Демо-версия:
Для лучшего представления я создал репозиторий GitHub с этими примерами, пожалуйста, найдите его ниже:
https://github.com/norbitrial/react-router-programmatically-redirect-examples
Надеюсь, это поможет!
источник