Bom*_*ber 94 javascript reactjs react-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();
}
});
Run Code Online (Sandbox Code Playgroud)
得到此错误,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);
});
Run Code Online (Sandbox Code Playgroud)
mlu*_*noe 87
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>
)
}
}
Run Code Online (Sandbox Code Playgroud)
var browserHistory = ReactRouter.browserHistory;
var BackButton = React.createClass({
render: function() {
return (
<button
className="button icon-left"
onClick={browserHistory.goBack}>
Back
</button>
);
}
});
Run Code Online (Sandbox Code Playgroud)
使用嵌入式iframe创建了一个更复杂的例子:https://jsfiddle.net/kwg1da3a/
你可以这样做:
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);
}
},
...
Run Code Online (Sandbox Code Playgroud)
你需要小心,你有必要的历史回去.如果您直接点击该页面然后回来,它会在您的应用程序之前返回浏览器历史记录.
该解决方案将处理这两种情况.但是,它不会使用后退按钮处理可以在页面中导航(并添加到浏览器历史记录)的iframe.坦率地说,我认为这是react-router中的一个错误.在此处创建的问题:https://github.com/rackt/react-router/issues/1874
Eri*_*rto 83
使用 React 钩子
进口:
import { useHistory } from "react-router-dom";
Run Code Online (Sandbox Code Playgroud)
在无状态组件中:
let history = useHistory();
Run Code Online (Sandbox Code Playgroud)
调用事件:
history.goBack()
Run Code Online (Sandbox Code Playgroud)
在事件按钮中使用的示例:
<button onClick={history.goBack}>Back</button>
Run Code Online (Sandbox Code Playgroud)
或者
<button onClick={() => history.goBack()}>Back</button>
Run Code Online (Sandbox Code Playgroud)
小智 40
this.context.router.goBack()
Run Code Online (Sandbox Code Playgroud)
无需导航mixin!
小智 37
进口 withRouter
import { withRouter } from 'react-router-dom';
Run Code Online (Sandbox Code Playgroud)将组件导出为:
export withRouter(nameofcomponent)
Run Code Online (Sandbox Code Playgroud)例如,点击按钮,调用goBack
:
<button onClick={this.props.history.goBack}>Back</button>
Run Code Online (Sandbox Code Playgroud)在react-router-dom
v4.3上测试过
小智 36
我认为您只需要在路由器上启用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);
Run Code Online (Sandbox Code Playgroud)
pto*_*son 31
没有mixins的ES6方法使用react-router,无状态函数.
import React from 'react'
import { browserHistory } from 'react-router'
export const Test = () => (
<div className="">
<button onClick={browserHistory.goBack}>Back</button>
</div>
)
Run Code Online (Sandbox Code Playgroud)
dha*_*ahn 22
返回特定页面:
import { useHistory } from "react-router-dom";
const history = useHistory();
const routeChange = () => {
let path = '/login';
history.push(path);
};
Run Code Online (Sandbox Code Playgroud)
返回上一页:
import { useHistory } from "react-router-dom";
const history = useHistory();
const routeChange = () => {
history.goBack()
};
Run Code Online (Sandbox Code Playgroud)
小智 10
我想稍微更新一下之前的答案。如果您正在使用react-router >v6.0
,那么这useHistory()
不是返回的正确方法。您会收到一个错误,因为我猜useHistory()
最新版本中不存在该错误。所以这是更新的答案
// This is a React Router v6 app
import { useNavigate } from "react-router-dom";
function App() {
const navigate = useNavigate();
return (
<>
<button onClick={() => navigate(-2)}>
Go 2 pages back
</button>
<button onClick={() => navigate(-1)}>Go back</button>
<button onClick={() => navigate(1)}>
Go forward
</button>
<button onClick={() => navigate(2)}>
Go 2 pages forward
</button>
</>
);
}
Run Code Online (Sandbox Code Playgroud)
使用这个useNavigate()
钩子。您可以在此处
v5
阅读此过渡的官方文档https://reactrouter.com/docs/en/v6/upgrading/v5v6
使用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)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
抱歉,代码很大,可以在这里发布
这是一个有效的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;
Run Code Online (Sandbox Code Playgroud)
如果没有历史记录,你可以选择这样做:
<button className="back" onClick={goBack}>{this.props.children}</button>
function goBack(e) {
if (/* no history */) {
e.preventDefault();
} else {
this.history.goBack();
}
}
Run Code Online (Sandbox Code Playgroud)
对于react-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
};
Run Code Online (Sandbox Code Playgroud)
在 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"));
Run Code Online (Sandbox Code Playgroud)
返回.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);
Run Code Online (Sandbox Code Playgroud)
演示: 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
Run Code Online (Sandbox Code Playgroud)
然后使用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"));
Run Code Online (Sandbox Code Playgroud)
返回.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);
Run Code Online (Sandbox Code Playgroud)
演示: https : //codesandbox.io/s/727nqm99jj
useNavigate
Hook 是现在返回的推荐方式:
import { useNavigate } from 'react-router-dom';
function App() {
const navigate = useNavigate();
return (
<>
<button onClick={() => navigate(-1)}>go back</button>
<button onClick={() => navigate(1)}>go forward</button>
</>
);
}
Run Code Online (Sandbox Code Playgroud)
后退/前进多个历史堆栈条目:
<button onClick={() => navigate(-2)}>go two back</button>
<button onClick={() => navigate(2)}>go two forward</button>
Run Code Online (Sandbox Code Playgroud)
前往具体路线:
navigate("users") // go to users route, like history.push
navigate("users", { replace: true }) // go to users route, like history.replace
navigate("users", { state }) // go to users route, pass some state in
Run Code Online (Sandbox Code Playgroud)
useNavigate
替换 useHistory
以更好地支持即将到来的 React Suspense/Concurrent 模式。
react-router-dom
在v6上import { useNavigate } from 'react-router-dom';
function goBack() {
const navigate = useNavigate();
return <button onClick={() => navigate(-1)}>go back</button>
}
Run Code Online (Sandbox Code Playgroud)
对我有用的是在我的文件顶部导入 withRouter ;
import { withRouter } from 'react-router-dom'
Run Code Online (Sandbox Code Playgroud)
然后用它把导出的函数包装在我的文件底部;
export default withRouter(WebSitePageTitleComponent)
Run Code Online (Sandbox Code Playgroud)
然后允许我访问路由器的历史记录道具。完整示例代码如下!
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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
211991 次 |
最近记录: |