React Router v4 - Komponente umleiten (aktualisiert am 15.04.2017)
Die von v4 empfohlene Methode besteht darin, Ihrer Rendermethode zu erlauben, eine Umleitung abzufangen. Verwenden Sie Status oder Requisiten, um zu bestimmen, ob die Umleitungskomponente angezeigt werden muss (was dann eine Umleitung auslöst).
import { Redirect } from 'react-router';
// ... your class implementation
handleOnClick = () => {
// some action...
// then redirect
this.setState({redirect: true});
}
render() {
if (this.state.redirect) {
return <Redirect push to="/sample" />;
}
return <button onClick={this.handleOnClick} type="button">Button</button>;
}
Referenz: https://reacttraining.com/react-router/web/api/Redirect
React Router v4 - Referenz-Router-Kontext
Sie können auch den Router
Kontext nutzen, der für die React-Komponente verfügbar ist.
static contextTypes = {
router: PropTypes.shape({
history: PropTypes.shape({
push: PropTypes.func.isRequired,
replace: PropTypes.func.isRequired
}).isRequired,
staticContext: PropTypes.object
}).isRequired
};
handleOnClick = () => {
this.context.router.push('/sample');
}
So <Redirect />
funktioniert es unter der Haube.
Referenz: https://github.com/ReactTraining/react-router/blob/master/packages/react-router/modules/Redirect.js#L46,L60
React Router v4 - Externes Verlaufsobjekt mutieren
Wenn Sie noch etwas Ähnliches wie die Implementierung von v2 tun müssen, können Sie eine Kopie von erstellen und diese BrowserRouter
dann history
als exportierbare Konstante verfügbar machen. Unten finden Sie ein grundlegendes Beispiel, aber Sie können es zusammenstellen, um es bei Bedarf mit anpassbaren Requisiten zu versehen. Es gibt einige Einschränkungen bei Lebenszyklen, aber der Router sollte immer neu gerendert werden, genau wie in Version 2. Dies kann für Weiterleitungen nach einer API-Anforderung von einer Aktionsfunktion hilfreich sein.
// browser router file...
import createHistory from 'history/createBrowserHistory';
import { Router } from 'react-router';
export const history = createHistory();
export default class BrowserRouter extends Component {
render() {
return <Router history={history} children={this.props.children} />
}
}
// your main file...
import BrowserRouter from './relative/path/to/BrowserRouter';
import { render } from 'react-dom';
render(
<BrowserRouter>
<App/>
</BrowserRouter>
);
// some file... where you don't have React instance references
import { history } from './relative/path/to/BrowserRouter';
history.push('/sample');
Spätestens BrowserRouter
zu erweitern: https://github.com/ReactTraining/react-router/blob/master/packages/react-router-dom/modules/BrowserRouter.js
Reagiere auf Router v2
Verschieben Sie einen neuen Status in die browserHistory
Instanz:
import {browserHistory} from 'react-router';
// ...
browserHistory.push('/sample');
Referenz: https://github.com/reactjs/react-router/blob/master/docs/guides/NavigatingOutsideOfComponents.md