Odpowiedź React-Router 5.1.0+ (za pomocą haków i React> 16,8)
Możesz użyć nowego useHistory
zaczepu w elementach funkcjonalnych i programowo nawigować:
import { useHistory } from "react-router-dom";
function HomeButton() {
let history = useHistory();
// use history.push('/some/path') here
};
React-Router 4.0.0+ Odpowiedź
W wersji 4.0 i nowszych użyj historii jako rekwizytu swojego komponentu.
class Example extends React.Component {
// use `this.props.history.push('/some/path')` here
};
UWAGA: this.props.history nie istnieje w przypadku, gdy twój komponent nie był renderowany <Route>
. Powinieneś użyć, <Route path="..." component={YourComponent}/>
aby mieć this.props.history w YourComponent
React-Router 3.0.0+ odpowiedzi
W wersji 3.0 i nowszej użyj routera jako rekwizytu swojego komponentu.
class Example extends React.Component {
// use `this.props.router.push('/some/path')` here
};
React-Router 2.4.0+ Odpowiedź
W wersji 2.4 i nowszej użyj komponentu wyższego rzędu, aby uzyskać router jako rekwizyt komponentu.
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
};
React-Router 2.0.0+ Odpowiedź
Ta wersja jest wstecznie kompatybilna z wersją 1.x, więc nie ma potrzeby Przewodnika aktualizacji. Samo przejrzenie przykładów powinno wystarczyć.
To powiedziawszy, jeśli chcesz przełączyć się na nowy wzorzec, w routerze znajduje się moduł browserHistory, do którego masz dostęp
import { browserHistory } from 'react-router'
Teraz masz dostęp do historii przeglądarki, dzięki czemu możesz wykonywać takie czynności, jak wypychanie, zastępowanie itp. Jak:
browserHistory.push('/some/path')
Dalsza lektura:
Historie i
nawigacja
React-Router 1.xx Odpowiedź
Nie będę wchodził w szczegóły aktualizacji. Możesz o tym przeczytać w Przewodniku aktualizacji
Główną zmianą w tym pytaniu jest zmiana z Mixinu nawigacji na Historię. Teraz używa interfejsu API historii przeglądarki do zmiany trasy, więc będziemy używać pushState()
odtąd.
Oto przykład użycia Mixin:
var Example = React.createClass({
mixins: [ History ],
navigateToHelpPage () {
this.history.pushState(null, `/help`);
}
})
Zauważ, że History
pochodzi to z projektu rack / history . Nie z samego React-Routera.
Jeśli z jakiegoś powodu nie chcesz używać Mixin (być może z powodu klasy ES6), możesz uzyskać dostęp do historii, którą otrzymujesz z routera this.props.history
. Będzie dostępny tylko dla komponentów renderowanych przez router. Tak więc, jeśli chcesz go używać w komponentach potomnych, musisz przekazać go jako atrybut przez props
.
Możesz przeczytać więcej o nowej wersji w dokumentacji 1.0.x.
Oto strona pomocy dotycząca nawigacji poza komponentem
Zaleca złapanie referencji history = createHistory()
i wywołanie replaceState
tego.
React-Router 0.13.x Odpowiedź
Wpadłem w ten sam problem i mogłem znaleźć rozwiązanie tylko dzięki mixinowi Nawigacji, który jest dostarczany z routerem reagującym.
Oto jak to zrobiłem
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>);
}
});
Mogłem zadzwonić transitionTo()
bez potrzeby dostępu.context
Lub możesz wypróbować fantazyjny 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
Uwaga: jeśli używasz Redux, istnieje inny projekt o nazwie
ReactRouter-Redux że daje Redux wiązania dla ReactRouter, używając nieco takie samo podejście, które
React-Redux robi
React-Router-Redux ma kilka dostępnych metod, które pozwalają na łatwą nawigację z poziomu kreatorów akcji wewnętrznych. Mogą być one szczególnie przydatne dla osób, które mają istniejącą architekturę w React Native i chcą korzystać z tych samych wzorców w React Web przy minimalnym nakładzie pracy.
Poznaj następujące metody:
push(location)
replace(location)
go(number)
goBack()
goForward()
Oto przykład użycia z 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>