【问题标题】:React Router - How to Determine If Back button was hit?React Router - 如何确定是否按下后退按钮?
【发布时间】:2017-06-11 07:14:09
【问题描述】:

我有这些场景

设置页面 -> 结果页面 -> 详细信息页面

用户选择设置,点击下一步,获得结果,然后点击进入更多细节。

详情页 -> 结果页

用户从详细信息页面返回结果页面。这会导致完全重新渲染,导致我再次无缘无故地访问服务器(我将结果存储在数组中)。

详细信息页面 -> 结果页面 -> 设置页面 -> 结果页面

用户查看详细信息,然后返回结果(想要获取存储的结果),然后返回设置页面,进行更改,然后返回结果页面(现在我想再次从服务器获取完整的结果)。

我想知道 react 路由器中是否存在确定我是通过浏览器历史记录访​​问页面还是前进的方式。

【问题讨论】:

  • Details 路由是 Results 路由的子路由吗?我的应用程序中存在这种情况,并且作为结果的子项的详细信息不会重新呈现结果(我有一个设置的主细节视图类型,并且没有对结果的请求)。另外,您是否在componentDidUpdate 中获取数据?
  • 不,它在路上。我以前做过任何子路线,也许会研究一下(它是否称为子路线)。我在 componentDidMount 中有 ajax 调用
  • 您是否使用Link 组件从一种视图切换到另一种视图?

标签: reactjs react-router


【解决方案1】:

我一直在寻找同样的东西,然后我终于找到了一个看似简单的解决方案。

快速回答:

我使用history.action 值来确定用户是来自后退按钮还是来自经典导航。 如果history.action 等于'POP',则返回按钮已被按下。否则为'PUSH'。

详细回答:

我可以访问每个页面的道具中的历史记录,因为我做了类似的事情:

<Provider store = { store }>
    <AppRouter />
</Provider>

AppRouter 在哪里:

import React from 'react';
import { Router, Route, Switch } from 'react-router-dom';
import createHistory from 'history/createBrowserHistory';
import PublicRoute from './PublicRoute';
import PageHome from '../pages/front/home/PageHome';

export const history = createHistory();

const AppRouter = () => (
    <Router history={ history }>
        <div>
            <Switch>
                <PublicRoute
                    exact = { true }
                    path = "/"
                    component = { PageHome }
                    history={ history }
                />
                < ..... Other routes here ..... >
            </Switch>
        </div>
    </Router>
);

export default AppRouter;

而PublicRoute 组件是这样的:

import React from 'react';
import { Route } from 'react-router-dom';
import Header from '../components/header/Header';

const PublicRoute = ( { component: Component, ...rest } ) => (
    <Route
        component={ ( props ) => (
            <div>
                <Header />
                <Component { ...props } />
            </div>
        )}
        { ...rest }
    />
);

export default PublicRoute;

【讨论】:

  • 有什么方法可以知道按下后退按钮的页面吗?..我的意思是路线。
【解决方案2】:

在 React Router 中,如果路由器调用该组件的子路径,则该组件保持挂载状态。因此,在您的示例中,您可以执行以下操作:

<Route path="items" component={Results}>
    <Route path=":id" component={Detail} />
</Route>

这样,当Detail 组件被挂载时,Results 组件不会被卸载,因为Detail 是Results 的子代。但是,如果您不想在 Detail 中看到 Results 组件被渲染,您只能在子组件存在时渲染它们。类似于以下内容:

 class Results extends React.Component {

     render() {
         if (this.props.children) {
             // This will enter Detail component
             return this.props.children;
         }
         return (
             // Render results component
         );
     }
 }

【讨论】:

  • 我应该为
  • 根据我的经验,to 总是相对于“/”起作用。所以,我只想写to={'/items/' + id}
  • 嗯还不能让它工作。你有什么,我的 ulrl 更改为 /#/results/0 但就是这样,页面没有改变。
  • 你能在路由器中用browserHistory代替hashHistory测试它吗?
  • 没有变化,我认为唯一可能影响它的是另一个名为 Result 的组件中的 。所以它实际上是 Results -> Result -> Detail 虽然 Result 是愚蠢的组件并呈现每个单独的结果并且是一个孩子或作为容器的结果。
猜你喜欢
  • 2019-08-28
  • 1970-01-01
  • 2018-08-07
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 2011-01-22
  • 2016-09-20
相关资源
最近更新 更多