В текущей версии React Router (v3) я могу принять ответ сервера и использовать browserHistory.push
для перехода на соответствующую страницу ответа. Тем не менее, это не доступно в v4, и я не уверен, как правильно это сделать.
В этом примере при использовании Redux компоненты / app-product-form.js вызывают, this.props.addProduct(props)
когда пользователь отправляет форму. Когда сервер возвращает успех, пользователь попадает на страницу корзины.
// actions/index.js
export function addProduct(props) {
return dispatch =>
axios.post(`${ROOT_URL}/cart`, props, config)
.then(response => {
dispatch({ type: types.AUTH_USER });
localStorage.setItem('token', response.data.token);
browserHistory.push('/cart'); // no longer in React Router V4
});
}
Как я могу сделать перенаправление на страницу корзины из функции для React Router v4?
context
для передачи того, что вам нужно, вручную - это «не пойдет». Если я не являюсь автором библиотеки, не должно быть необходимости его использовать. На самом деле, Facebook рекомендует против этого.history
также работает для React Native как опция, а также опция поддержки устаревших браузеров.Ответы:
Вы можете использовать
history
методы за пределами ваших компонентов. Попробуйте следующим образом.Сначала создайте
history
объект, используя пакет истории :Затем оберните его
<Router>
( обратите внимание , вы должны использоватьimport { Router }
вместоimport { BrowserRouter as Router }
):Измените свое текущее местоположение из любого места, например:
UPD : Вы также можете увидеть немного другой пример в FAQ по React Router .
источник
history.push('some path')
этого URL-адрес меняется, но страница не меняется. Я должен поместитьwindow.location.reload()
его в некоторые части своего кода, чтобы он работал. Тем не менее, в одном случае я должен сохранить избыточное дерево состояний, а перезагрузка уничтожает его. Любое другое решение?withRouter
компонент высшего порядка.import createHistory from 'history/createBrowserHistory'; export default createHistory();
будет работать.React Router v4 принципиально отличается от v3 (и более ранних версий), и вы не можете делать то,
browserHistory.push()
что делали раньше.Это обсуждение кажется связанным, если вы хотите больше информации:
Вместо этого у вас есть несколько вариантов сделать это:
Используйте
withRouter
компонент высокого порядкаВместо этого вы должны использовать
withRouter
компонент высшего порядка и перенести его в компонент, который будет перемещаться в историю. Например:Проверьте официальную документацию для получения дополнительной информации:
Используйте
context
APIИспользование контекста может быть одним из самых простых решений, но, будучи экспериментальным API, оно нестабильно и не поддерживается. Используйте это только когда все остальное терпит неудачу. Вот пример:
Посмотрите на официальную документацию по контексту:
источник
this.context.router.history.push('/path');
Теперь с response-router v5 вы можете использовать ловушку жизненного цикла useHistory следующим образом:
читать больше на: https://reacttraining.com/react-router/web/api/Hooks/usehistory
источник
let history = useHistory();
но получаю сообщениеObject is not callable
об ошибке, когда я пытался увидеть, что такое useHistory,console.log(useHistory)
оно отображается как неопределенное. используя"react-router-dom": "^5.0.1"
Простейшим способом в React Router 4 является использование
Но чтобы использовать этот метод, ваш существующий компонент должен иметь доступ к
history
объекту. Мы можем получить доступ поЕсли ваш компонент связан с
Route
напрямую, то ваш компонент уже имеет доступ кhistory
объекту.например:
Здесь
ViewProfile
есть доступ кhistory
.Если не подключен
Route
напрямую.например:
Затем мы должны использовать
withRouter
функцию более высокого порядка, чтобы деформировать существующий компонент.Внутри
ViewUsers
компонентаimport { withRouter } from 'react-router-dom';
export default withRouter(ViewUsers);
Теперь у вашего
ViewUsers
компонента есть доступ кhistory
объекту.ОБНОВИТЬ
2
- в этом случае передайте весь маршрутprops
к вашему компоненту, и тогда мы сможем получить доступthis.props.history
из компонента даже безHOC
например:
источник
this.props.history
) происходит из HOC, что означает, что он не связан напрямую сRoute
, как вы объясняете.Вот как я это сделал:
Используйте
this.props.history.push('/cart');
для перенаправления на страницу корзины, она будет сохранена в истории объекта.Наслаждайся, Майкл.
источник
Согласно документации React Router v4 - сессия Redux Deep Integration
Глубокая интеграция необходима для:
Однако они рекомендуют этот подход в качестве альтернативы "глубокой интеграции":
Таким образом, вы можете обернуть ваш компонент компонентом высшего порядка withRouter:
export default withRouter(connect(null, { actionCreatorName })(ReactComponent));
который будет передавать историю API для реквизита. Таким образом, вы можете назвать создателя действия, передавая историю в качестве параметра. Например, внутри вашего ReactComponent:
Затем внутри ваших действий / index.js:
источник
Непростой вопрос, занял у меня довольно много времени, но в итоге я решил его так:
Оберните свой контейнер
withRouter
и передайте историю в ваши действия вmapDispatchToProps
функции. В действии используйте history.push ('/ url') для навигации.Действие:
Контейнер:
Это справедливо для React v4.x маршрутизатора .
источник
import { createBrowserHistory } from 'history'
какой - либо идеи , пожалуйста?this.context.history.push
не будет работать.Мне удалось получить толчок, работая так:
источник
В этом случае вы передаете реквизит своему толпу. Так что вы можете просто позвонить
Если это не так, вы все равно можете передать историю из вашего компонента
источник
Я предлагаю еще одно решение, если оно того стоит.
У меня есть
history.js
файл, где у меня есть следующее:Далее, в моем Root, где я определяю свой маршрутизатор, я использую следующее:
Наконец,
actions.js
я импортирую историю и использую pushLaterТаким образом, я могу перейти к новым действиям после вызовов API.
Надеюсь, поможет!
источник
Если вы используете Redux, то я бы порекомендовал использовать пакет npm response -router-redux . Позволяет отправлять в Redux магазин навигационных действий.
Вы должны создать магазин, как описано в их файле Readme .
Самый простой вариант использования:
Второй вариант использования с контейнером / компонентом:
Контейнер:
Составная часть:
источник
next
версию, которая все еще находится в стадии разработки!Я смог сделать это с помощью
bind()
. Я хотел нажать кнопкуindex.jsx
, опубликовать некоторые данные на сервере, оценить ответ и перенаправить наsuccess.jsx
. Вот как я это выяснил ...index.jsx
:request.js
:success.jsx
:Так что, связавшись
this
сpostData
inindex.jsx
, я смог получить доступthis.props.history
кrequest.js
... тогда я могу повторно использовать эту функцию в разных компонентах, просто убедитесь, что я не забудьте включить ееthis.postData = postData.bind(this)
вconstructor()
.источник
Вот мой хак (это мой файл корневого уровня, с небольшим добавленным там редуксом - хотя я не использую
react-router-redux
):Затем я могу использовать в
window.appHistory.push()
любом месте, где захочу (например, в моих функциях магазина редуксов / thunks / sagas и т. Д.), Я надеялся, что смогу просто использовать,window.customHistory.push()
но по какой-то причинеreact-router
никогда не обновлялся, хотя URL-адрес изменился. Но так у меня есть экземпляр EXACTreact-router
. Я не люблю помещать вещи в глобальную сферу, и это одна из немногих вещей, с которыми я бы сделал это. Но это лучше, чем любая другая альтернатива, которую я видел в ИМО.источник
Используйте Обратный звонок. Это сработало для меня!
В компоненте вам просто нужно добавить обратный вызов
источник
так что я делаю это так: - вместо перенаправления с помощью
history.push
я просто используюRedirect
компонент изreact-router-dom
При использовании этого компонента вы можете просто передатьpush=true
, и он позаботится обо всем остальномисточник
React router V4 теперь позволяет использовать историю, как показано ниже:
В этом случае к значению можно получить доступ везде, где доступна информация о местонахождении как
state:{value}
состояние компонента.источник
Вы можете использовать это так, как я делаю это для входа в систему и разные вещи Мэнни
источник
источник
Шаг первый обернуть ваше приложение в маршрутизаторе
Теперь все мое приложение будет иметь доступ к BrowserRouter. Шаг второй: импортирую Route, а затем передаю эти реквизиты. Вероятно, в одном из ваших основных файлов.
Теперь, если я запускаю console.log (this.props) в моем js-файле компонента, я должен получить что-то похожее на это
Шаг 2 Я могу получить доступ к объекту истории, чтобы изменить свое местоположение
Кроме того, я просто студент-программист, поэтому я не эксперт, но я знаю, что вы также можете использовать
Поправьте меня, если я ошибаюсь, но когда я проверил это, он перезагрузил всю страницу, которая, как мне показалось, побеждала весь смысл использования React.
источник
Создайте кастом
Router
со своим собственнымbrowserHistory
:Далее, в вашем Root, где вы определяете свой
Router
, используйте следующее:Наконец, импортируйте
history
туда , где вам это нужно, и используйте его:источник
Если вы хотите использовать историю во время передачи функции в качестве значения для свойства Компонента , с помощью реакции-маршрутизатора 4 вы можете просто деструктурировать структуру
history
в атрибуте рендеринга<Route/>
Компонента, а затем использоватьhistory.push()
Примечание: чтобы это работало, вы должны обернуть компонент BrowserRouter React Router вокруг корневого компонента (например, который может быть в index.js)
источник