реагировать-маршрутизатор вернуться на страницу как настроить историю?
при использовании этого кода:
var BackButton = React.createClass({
mixins: [Router.Navigation],
render: function() {
return (
<button
className="button icon-left"
onClick={this.navigateBack}>
Back
</button>
);
},
navigateBack: function(){
this.goBack();
}
});
получаете эту ошибку, goBack () был проигнорирован, потому что нет истории маршрутизатора
вот мои маршруты:
// Routing Components
Route = Router.Route;
RouteHandler = Router.RouteHandler;
DefaultRoute = Router.DefaultRoute;
var routes = (
<Route name="app" path="/" handler={OurSchoolsApp}>
<DefaultRoute name="home" handler={HomePage} />
<Route name="add-school" handler={AddSchoolPage} />
<Route name="calendar" handler={CalendarPage} />
<Route name="calendar-detail" path="calendar-detail/:id" handler={CalendarDetailPage} />
<Route name="info-detail" path="info-detail/:id" handler={InfoDetailPage} />
<Route name="info" handler={InfoPage} />
<Route name="news" handler={NewsListPage} />
<Route name="news-detail" path="news-detail/:id" handler={NewsDetailPage} />
<Route name="contacts" handler={ContactPage} />
<Route name="contact-detail" handler={ContactDetailPage} />
<Route name="settings" handler={SettingsPage} />
</Route>
);
Router.run(routes, function(Handler){
var mountNode = document.getElementById('app');
React.render(<Handler /> , mountNode);
});
15 ответов:
Я думаю, вам просто нужно включить BrowserHistory на вашем маршрутизаторе, инициализируя его так:
<Router history={new BrowserHistory}>
.перед этим, вы должны требовать
BrowserHistory
С'react-router/lib/BrowserHistory'
Я надеюсь, что помогает !
обновление: пример в ES6
var BrowserHistory = require('react-router/lib/BrowserHistory').default; var App = React.createClass({ render: function() { return ( <div><button onClick={BrowserHistory.goBack}>Go Back</button></div> ); } }); React.render(( <Router history={BrowserHistory}> <Route path="/" component={App} /> </Router> ), document.body);
обновление с React v16 и ReactRouter v4.2. 0 (октябрь 2017):
class BackButton extends Component { static contextTypes = { router: () => true, // replace with PropTypes.object if you use them } render() { return ( <button className="button icon-left" onClick={this.context.router.history.goBack}> Back </button> ) } }
обновление с React v15 и ReactRouter v3.0. 0 (август 2016):
var browserHistory = ReactRouter.browserHistory; var BackButton = React.createClass({ render: function() { return ( <button className="button icon-left" onClick={browserHistory.goBack}> Back </button> ); } });
создал скрипку с немного более сложным примером со встроенным iframe:https://jsfiddle.net/kwg1da3a/
React v14 и ReacRouter v1.0. 0 (Sep 10, 2015)
вы можете сделать это:
var React = require("react"); var Router = require("react-router"); var SomePage = React.createClass({ ... contextTypes: { router: React.PropTypes.func }, ... handleClose: function () { if (Router.History.length > 1) { // this will take you back if there is history Router.History.back(); } else { // this will take you to the parent route if there is no history, // but unfortunately also add it as a new route var currentRoutes = this.context.router.getCurrentRoutes(); var routeName = currentRoutes[currentRoutes.length - 2].name; this.context.router.transitionTo(routeName); } }, ...
вы должны быть осторожны, что у вас есть необходимые истории возвращаться. Если вы нажмете на страницу напрямую, а затем вернетесь, она вернет вас в историю браузера до вашего приложения.
это решение будет заботиться о обоих случаях. Однако он не будет обрабатывать iframe, который может перемещаться по странице (и добавлять в историю браузера) с помощью кнопки "Назад". Честно говоря, я думаю, что это ошибка в react-router. Выпуск создан здесь:https://github.com/rackt/react-router/issues/1874
способ ЕС6 без примесей, используя реагировать-маршрутизатор, функцией без гражданства.
import React from 'react' import { browserHistory } from 'react-router' export const Test = () => ( <div className=""> <button onClick={browserHistory.goBack}>Back</button> </div> )
импорт
withRouter
import { withRouter } from 'react-router-dom';
экспортируйте ваш компонент как:
export withRouter(nameofcomponent)
пример, при нажатии кнопки, вызов
goBack
:<button onClick={this.props.history.goBack}>Back</button>
проверено на
react-router-dom
В4.3
это рабочий компонент BackButton (React 0.14):
var React = require('react'); var Router = require('react-router'); var History = Router.History; var BackButton = React.createClass({ mixins: [ History ], render: function() { return ( <button className="back" onClick={this.history.goBack}>{this.props.children}</button> ); } }); module.exports = BackButton;
вы можете, конечно, сделать что-то вроде этого, если нет истории:
<button className="back" onClick={goBack}>{this.props.children}</button> function goBack(e) { if (/* no history */) { e.preventDefault(); } else { this.history.goBack(); } }
для react-router v2.х это изменилось. Вот что я делаю для ES6:
import React from 'react'; import FontAwesome from 'react-fontawesome'; import { Router, RouterContext, Link, browserHistory } from 'react-router'; export default class Header extends React.Component { render() { return ( <div id="header"> <div className="header-left"> { this.props.hasBackButton && <FontAwesome name="angle-left" className="back-button" onClick={this.context.router.goBack} /> } </div> <div>{this.props.title}</div> </div> ) } } Header.contextTypes = { router: React.PropTypes.object }; Header.defaultProps = { hasBackButton: true }; Header.propTypes = { title: React.PropTypes.string };
зацените мой рабочий пример с использованием реагируют 16,0 С реагировать-маршрутизатор В4 Пример Github
использовать
withRouter
иhistory.goBack()
это идея, которую я реализую...
история.js
import React, { Component } from 'react'; import { withRouter } from 'react-router-dom' import './App.css' class History extends Component { handleBack = () => { this.props.history.goBack() } handleForward = () => { console.log(this.props.history) this.props.history.go(+1) } render() { return <div className="container"> <div className="row d-flex justify-content-between"> <span onClick={this.handleBack} className="d-flex justify-content-start button"> <i className="fas fa-arrow-alt-circle-left fa-5x"></i> </span> <span onClick={this.handleForward} className="d-flex justify-content-end button"> <i className="fas fa-arrow-alt-circle-right fa-5x"></i> </span> </div> </div> } } export default withRouter(History)
PageOne.js
import React, { Fragment, Component } from 'react' class PageOne extends Component { componentDidMount(){ if(this.props.location.state && this.props.location.state.from != '/pageone') this.props.history.push({ pathname: '/pageone', state: { from: this.props.location.pathname } }); } render() { return ( <Fragment> <div className="container-fluid"> <div className="row d-flex justify-content-center"> <h2>Page One</h2> </div> </div> </Fragment> ) } } export default PageOne
p.s. извините код большой, чтобы разместить все это здесь
в react-router v4.X вы можете использовать
history.goBack
что эквивалентноhistory.go(-1)
.приложение.js
import React from "react"; import { render } from "react-dom"; import { BrowserRouter as Router, Route, Link } from "react-router-dom"; import Home from "./Home"; import About from "./About"; import Contact from "./Contact"; import Back from "./Back"; const styles = { fontFamily: "sans-serif", textAlign: "left" }; const App = () => ( <div style={styles}> <Router> <div> <ul> <li><Link to="/">Home</Link></li> <li><Link to="/about">About</Link></li> <li><Link to="/contact">Contact</Link></li> </ul> <hr /> <Route exact path="/" component={Home} /> <Route path="/about" component={About} /> <Route path="/contact" component={Contact} /> <Back />{/* <----- This is component that will render Back button */} </div> </Router> </div> ); render(<App />, document.getElementById("root"));
обратно.js
import React from "react"; import { withRouter } from "react-router-dom"; const Back = ({ history }) => ( <button onClick={history.goBack}>Back to previous page</button> ); export default withRouter(Back);
Demo: https://codesandbox.io/s/ywmvp95wpj
пожалуйста, помните, что с помощью
history
ваши пользователи могут уйти, потому чтоhistory.goBack()
можно загрузить страницу, которую посетитель посетил перед открытием приложения.
To предотвратите такую ситуацию, как описано выше, я создал простую библиотеку react-router-last-location что смотреть ваши пользователи последнее место.
использование очень прямо вперед. Сначала вам нужно установить
react-router-dom
иreact-router-last-location
Сnpm
.npm install react-router-dom react-router-last-location --save
затем использовать
LastLocationProvider
как показано ниже:приложение.js
import React from "react"; import { render } from "react-dom"; import { BrowserRouter as Router, Route, Link } from "react-router-dom"; import { LastLocationProvider } from "react-router-last-location"; // ↑ // | // | // // Import provider // import Home from "./Home"; import About from "./About"; import Contact from "./Contact"; import Back from "./Back"; const styles = { fontFamily: "sans-serif", textAlign: "left" }; const App = () => ( <div style={styles}> <h5>Click on About to see your last location</h5> <Router> <LastLocationProvider>{/* <---- Put provider inside <Router> */} <div> <ul> <li><Link to="/">Home</Link></li> <li><Link to="/about">About</Link></li> <li><Link to="/contact">Contact</Link></li> </ul> <hr /> <Route exact path="/" component={Home} /> <Route path="/about" component={About} /> <Route path="/contact" component={Contact} /> <Back /> </div> </LastLocationProvider> </Router> </div> ); render(<App />, document.getElementById("root"));
обратно.js
import React from "react"; import { Link } from "react-router-dom"; import { withLastLocation } from "react-router-last-location"; // ↑ // | // | // // `withLastLocation` higher order component // will pass `lastLocation` to your component // // | // | // ↓ const Back = ({ lastLocation }) => ( lastLocation && <Link to={lastLocation || '/'}>Back to previous page</Link> ); // Remember to wrap // your component before exporting // // | // | // ↓ export default withLastLocation(Back);
import { withRouter } from 'react-router-dom' this.props.history.goBack();
Я использую эти версии
"react": "^15.6.1", "react-dom": "^15.6.1", "react-router": "^4.2.0", "react-router-dom": "^4.2.2",
вызовите следующий компонент следующим образом:
<BackButton history={this.props.history} />
и вот компонент:
import React, { Component } from 'react' import PropTypes from 'prop-types' class BackButton extends Component { constructor() { super(...arguments) this.goBack = this.goBack.bind(this) } render() { return ( <button onClick={this.goBack}> Back </button> ) } goBack() { this.props.history.goBack() } } BackButton.propTypes = { history: PropTypes.object, } export default BackButton
Я использую:
"react": "15.6.1" "react-router": "4.2.0"
возвращение
вы также можете использовать
react-router-redux
имеющегоgoBack()
иpush()
.вот пакет сэмплера для этого:
в точке входа вашего приложения, вам нужно
ConnectedRouter
, и иногда сложное соединение для подключения-это . Если вы пойдете по этому пути, вы узнаете, что метод подключения Redux используетshouldComponentUpdate
. СrouterReducer
, вы можете использоватьmapStateToProps
чтобы отобразить изменения маршрутизации в навигационной панели, и это вызовет его для обновления при изменении объекта истории.такой:
const mapStateToProps = ({ routing }) => ({ routing }) export default connect(mapStateToProps)(Nav)
Простите меня, пока я добавляю некоторые дополнительные ключевые слова для людей: если ваш компонент не обновляется должным образом, расследовать
shouldComponentUpdate
путем удаления функции подключения и посмотреть, если он устраняет проблему. Если это так, потяните вrouterReducer
и компонент будет автоматически обновляться при изменении URL-адреса.в заключение, сделав все это, вы можете позвонить
goBack()
илиpush()
в любое время вы хотите!попробуйте сейчас в каком-нибудь случайном компоненте:
- импорт в
connect()
- вам даже не нужно
mapStateToProps
илиmapDispatchToProps
- импорт в goBack и push от
react-router-redux
- вызов
this.props.dispatch(goBack())
- вызов
this.props.dispatch(push('/sandwich'))
- испытывать положительные эмоции
Если вам нужно больше выборки, проверьте:https://www.npmjs.com/package/react-router-redux