React Router v4 - компонент перенаправлення (оновлено 2017/04/15)
Рекомендований v4 спосіб - дозволити вашому методу візуалізації зловити переадресацію. Використовуйте стан або реквізит, щоб визначити, чи потрібно показувати компонент переадресації (який потім тригер - це переадресація).
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>;
}
Довідка: https://reacttraining.com/react-router/web/api/Redirect
Реактивний маршрутизатор v4 - контекст опорного маршрутизатора
Ви також можете скористатися Routerконтекстом, який піддається впливу компонента React.
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');
}
Так <Redirect />працює під кришкою.
Довідка: https://github.com/ReactTraining/react-router/blob/master/packages/react-router/modules/Redirect.js#L46,L60
Реактивний маршрутизатор v4 - зовнішній мутаційний об'єкт історії
Якщо вам все-таки потрібно зробити щось подібне до впровадження v2, ви можете створити копію, BrowserRouterа потім викласти експозицію historyяк константу, що експортується. Нижче наведено основний приклад, але ви можете скласти його, щоб ввести його за допомогою налаштованих реквізитів, якщо це необхідно. Існують помітні застереження з життєвими циклами, але він повинен завжди відтворювати маршрутизатор, як і в v2. Це може бути корисно для переадресації після запиту API від дії функції.
// 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');
Останні BrowserRouterрозширення: https://github.com/ReactTraining/react-router/blob/master/packages/react-router-dom/modules/BrowserRouter.js
Реагує маршрутизатор v2
Натисніть на новий browserHistoryекземпляр:
import {browserHistory} from 'react-router';
// ...
browserHistory.push('/sample');
Довідка: https://github.com/reactjs/react-router/blob/master/docs/guides/NavigatingOutsideOfComponents.md