Відповідь React-Router 5.1.0+ (за допомогою гачків та React> 16.8)
Ви можете використовувати новий useHistory
гак на функціональних компонентах і програмно переходити:
import { useHistory } from "react-router-dom";
function HomeButton() {
let history = useHistory();
// use history.push('/some/path') here
};
Реагувати-маршрутизатор 4.0.0+ Відповідь
В версії 4.0 і вище використовуйте історію як опору свого компонента.
class Example extends React.Component {
// use `this.props.history.push('/some/path')` here
};
ПРИМІТКА: this.props.history не існує у випадку, якщо ваш компонент не був наданий <Route>
. Ви повинні використовувати, <Route path="..." component={YourComponent}/>
щоб мати this.props.history у своєму компоненті
Реагувати-маршрутизатор 3.0.0+ Відповідь
В версії 3.0 і вище використовуйте роутер як опору вашого компонента.
class Example extends React.Component {
// use `this.props.router.push('/some/path')` here
};
Реагувати-маршрутизатор 2.4.0+ Відповідь
У версії 2.4 і вище використовуйте компонент вищого порядку, щоб отримати маршрутизатор як опору вашого компонента.
import { withRouter } from 'react-router';
class Example extends React.Component {
// use `this.props.router.push('/some/path')` here
};
// Export the decorated class
var DecoratedExample = withRouter(Example);
// PropTypes
Example.propTypes = {
router: React.PropTypes.shape({
push: React.PropTypes.func.isRequired
}).isRequired
};
Реагувати-маршрутизатор 2.0.0+ Відповідь
Ця версія назад сумісна з 1.x, тому немає необхідності в Посібнику з оновлення. Просто перегляд прикладів повинен бути досить хорошим.
Це означає, що якщо ви хочете перейти на новий зразок, всередині маршрутизатора є модуль історії браузера, до якого ви можете отримати доступ
import { browserHistory } from 'react-router'
Тепер у вас є доступ до історії вашого веб-переглядача, тому ви можете робити такі дії, як "push", "заміна" тощо ...
browserHistory.push('/some/path')
Подальше читання:
Історії та
навігація
Реагувати-маршрутизатор 1.xx Відповідь
Я не буду вникати в оновлення деталей. Про це можна прочитати в Посібнику з оновлення
Основна зміна питання тут - це зміна навігаційного міксину на історію. Тепер він використовує історію браузераAPI для зміни маршруту, тому ми будемо використовуватись pushState()
відтепер.
Ось приклад використання Mixin:
var Example = React.createClass({
mixins: [ History ],
navigateToHelpPage () {
this.history.pushState(null, `/help`);
}
})
Зауважте, що це History
походить від проекту rackt / history . Не від самого React-Router.
Якщо ви не хочете використовувати Mixin з якихось причин (можливо, через клас ES6), ви можете отримати доступ до історії, яку ви отримуєте від маршрутизатора this.props.history
. Він буде доступний лише для компонентів, наданих маршрутизатором. Отже, якщо ви хочете використовувати його в будь-яких дочірніх компонентах, його потрібно передавати як атрибут via props
.
Детальніше про нову версію ви можете прочитати в їх документації 1.0.x
Ось довідкова сторінка, зокрема про навігацію за межами вашого компонента
Він рекомендує захопити посилання history = createHistory()
та зателефонувати replaceState
на це.
React-Router 0.13.x відповідь
Я зіткнувся з тією ж проблемою і міг знайти рішення лише за допомогою навігаційного міксину, який постачається з реактором-маршрутизатором.
Ось як я це зробив
import React from 'react';
import {Navigation} from 'react-router';
let Authentication = React.createClass({
mixins: [Navigation],
handleClick(e) {
e.preventDefault();
this.transitionTo('/');
},
render(){
return (<div onClick={this.handleClick}>Click me!</div>);
}
});
Мені вдалося зателефонувати transitionTo()
без необхідності доступу.context
Або ви можете спробувати фантазійний ES6 class
import React from 'react';
export default class Authentication extends React.Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick(e) {
e.preventDefault();
this.context.router.transitionTo('/');
}
render(){
return (<div onClick={this.handleClick}>Click me!</div>);
}
}
Authentication.contextTypes = {
router: React.PropTypes.func.isRequired
};
React-Router-Redux
Примітка: якщо ви використовуєте Redux, є ще один проект під назвою
ReactRouter-Redux , який дає вам Redux прив'язок для ReactRouter, використовуючи кілька той же підхід , що
React-Redux робить
React-Router-Redux має декілька доступних методів, які дозволяють просту навігацію від творців всередині дій. Вони можуть бути особливо корисними для людей, які мають існуючу архітектуру в React Native, і вони хочуть використовувати ті самі шаблони в React Web з мінімальними накладними витратами.
Вивчіть наступні методи:
push(location)
replace(location)
go(number)
goBack()
goForward()
Ось приклад використання Redux-Thunk :
./actioncreators.js
import { goBack } from 'react-router-redux'
export const onBackPress = () => (dispatch) => dispatch(goBack())
./viewcomponent.js
<button
disabled={submitting}
className="cancel_button"
onClick={(e) => {
e.preventDefault()
this.props.onBackPress()
}}
>
CANCEL
</button>