Response-router вернуться на страницу, как вы настраиваете историю?
Может кто-нибудь сказать, пожалуйста, как я могу вернуться на предыдущую страницу, а не конкретный маршрут?
При использовании этого кода:
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);
});
Ответы
Ответ 1
Я думаю, что вам просто нужно включить BrowserHistory на вашем маршрутизаторе, инициализировав его следующим образом: <Router history={new BrowserHistory}>
.
Перед этим вы должны запросить BrowserHistory
'react-router/lib/BrowserHistory'
Надеюсь, это поможет !
ОБНОВЛЕНИЕ: пример в ES6
const BrowserHistory = require('react-router/lib/BrowserHistory').default;
const App = React.createClass({
render: () => {
return (
<div><button onClick={BrowserHistory.goBack}>Go Back</button></div>
);
}
});
React.render((
<Router history={BrowserHistory}>
<Route path="/" component={App} />
</Router>
), document.body);
Ответ 2
Обновление с помощью 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 (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, который может перемещаться по странице (и добавлять в историю браузера), с помощью кнопки "Назад". Честно говоря, я думаю, что это ошибка в ретрансляторе. Проблема, созданная здесь: https://github.com/rackt/react-router/issues/1874
Ответ 3
this.context.router.goBack()
Никакой навигационный миксин не требуется!
Ответ 4
Метод ES6 без миксинов с использованием реактивного маршрутизатора, функция без сохранения.
import React from 'react'
import { browserHistory } from 'react-router'
export const Test = () => (
<div className="">
<button onClick={browserHistory.goBack}>Back</button>
</div>
)
Ответ 5
-
импорт с помощью withRouter
import { withRouter } from 'react-router-dom';
-
Экспортируйте ваш компонент как:
export withRouter(nameofcomponent)
-
Например, при нажатии кнопки вызовите goBack
:
<button onClick={this.props.history.goBack}>Back</button>
Протестировано на react-router-dom
v4.3
Ответ 6
Это рабочий компонент 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();
}
}
Ответ 7
Для response-router v2.x это изменилось. Вот что я делаю для 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
};
Ответ 8
Посмотрите мой рабочий пример с использованием React 16.0 с React-router v4 Live Example. проверить код Github
Используйте withRouter
и history.goBack()
Это идея, которую я реализую...
History.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
ps извините код слишком большой, чтобы опубликовать все это здесь
Ответ 9
this.props.history.goBack();
Это работает с историей браузера и Hash.
Ответ 10
В response-router v4.x вы можете использовать history.goBack
, который эквивалентен history.go(-1)
.
App.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"));
Back.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()
может загрузить страницу, посетившую посетителя, прежде чем открывать ваше приложение.
Чтобы предотвратить такую ситуацию, как описано выше, я создал простую библиотеку react-router-last-location, которая будет следить за вашим последним местоположением пользователей.
Использование очень прямолинейно.
Сначала вам нужно установить react-router-dom
и react-router-last-location
из npm
.
npm install react-router-dom react-router-last-location --save
Затем используйте LastLocationProvider
, как показано ниже:
App.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"));
Back.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);
Демо: https://codesandbox.io/s/727nqm99jj
Ответ 11
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",
Ответ 12
Вызвать следующий компонент следующим образом:
<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"
Ответ 13
Что мне помогло, так это импортировать с помощью роутера вверху моего файла;
import { withRouter } from 'react-router-dom'
Затем используйте его, чтобы обернуть экспортированную функцию внизу моего файла;
export default withRouter(WebSitePageTitleComponent)
Который затем позволил мне получить доступ к реквизиту истории маршрутизатора. Полный пример кода ниже!
import React, { Component } from 'react'
import { withRouter } from 'react-router-dom'
import PropTypes from 'prop-types'
class TestComponent extends Component {
constructor(props) {
super(props)
this.handleClick = this.handleClick.bind(this)
}
handleClick() {
event.preventDefault()
this.props.history.goBack()
}
render() {
return (
<div className="page-title">
<a className="container" href="/location" onClick={this.handleClick}>
<h1 className="page-header">
{ this.props.title }
</h1>
</a>
</div>
)
}
}
const { string, object } = PropTypes
TestComponent.propTypes = {
title: string.isRequired,
history: object
}
export default withRouter(TestComponent)
Ответ 14
REDUX
Вы также можете использовать goBack()
react-router-redux
которого есть goBack()
и push()
.
Вот пример пакета для этого:
В точке входа вашего приложения вам нужен ConnectedRouter
, и иногда сложное соединение для подключения является объектом history
. Промежуточное программное обеспечение Redux прослушивает изменения истории:
import React from 'react'
import { render } from 'react-dom'
import { ApolloProvider } from 'react-apollo'
import { Provider } from 'react-redux'
import { ConnectedRouter } from 'react-router-redux'
import client from './components/apolloClient'
import store, { history } from './store'
import Routes from './Routes'
import './index.css'
render(
<ApolloProvider client={client}>
<Provider store={store}>
<ConnectedRouter history={history}>
<Routes />
</ConnectedRouter>
</Provider>
</ApolloProvider>,
document.getElementById('root'),
)
Я покажу вам способ зацепить history
. Обратите внимание, как история импортируется в хранилище, а также экспортируется как одноэлементная, чтобы ее можно было использовать в точке входа приложения:
import { createStore, applyMiddleware, compose } from 'redux'
import { routerMiddleware } from 'react-router-redux'
import thunk from 'redux-thunk'
import createHistory from 'history/createBrowserHistory'
import rootReducer from './reducers'
export const history = createHistory()
const initialState = {}
const enhancers = []
const middleware = [thunk, routerMiddleware(history)]
if (process.env.NODE_ENV === 'development') {
const { devToolsExtension } = window
if (typeof devToolsExtension === 'function') {
enhancers.push(devToolsExtension())
}
}
const composedEnhancers = compose(applyMiddleware(...middleware), ...enhancers)
const store = createStore(rootReducer, initialState, composedEnhancers)
export default store
Приведенный выше примерный блок показывает, как загрузить помощники промежуточного программного обеспеченияact react-router-redux
которые завершают процесс установки.
Я думаю, что эта следующая часть совершенно лишняя, но я включу ее на тот случай, если кто-то в будущем найдет пользу:
import { combineReducers } from 'redux'
import { routerReducer as routing } from 'react-router-redux'
export default combineReducers({
routing, form,
})
Я все время использую routerReducer
потому что он позволяет мне принудительно перезагружать компоненты, которые обычно не выполняются из-за shouldComponentUpdate
. Очевидный пример - когда у вас есть панель навигации, которая должна обновляться, когда пользователь нажимает кнопку NavLink
. Если вы пойдете по этому пути, вы узнаете, что метод подключения Redux использует shouldComponentUpdate
. С routerReducer
вы можете использовать mapStateToProps
чтобы отобразить изменения маршрутизации в mapStateToProps
навигации, и это заставит ее обновляться при изменении объекта истории.
Как это:
const mapStateToProps = ({ routing }) => ({ routing })
export default connect(mapStateToProps)(Nav)
Простите, пока я добавляю некоторые дополнительные ключевые слова для людей: если ваш компонент не обновляется должным образом, исследуйте shouldComponentUpdate
, удалив функцию подключения, и посмотрите, shouldComponentUpdate
ли она проблему. Если это так, routerReducer
и компонент изменится должным образом при изменении URL.
В заключение, после всего этого вы можете вызывать goBack()
или push()
любое время!
Попробуйте сейчас в некотором случайном компоненте:
- Импортировать в
connect()
- Вам даже не нужны
mapStateToProps
или mapDispatchToProps
- Импортируйте в goBack и отправьте из
react-router-redux
- Вызовите
this.props.dispatch(goBack())
- Вызовите
this.props.dispatch(push('/sandwich'))
- Испытать положительные эмоции
Если вам нужно больше проб, проверьте: https://www.npmjs.com/package/react-router-redux
Ответ 15
Просто используйте как это
<span onClick={() => this.props.history.goBack()}>Back</span>
Ответ 16
Этот кусок кода поможет вам.
this.context.router.history.goBack()