检测react-router中的先前路径?

IT技术 reactjs react-router
2021-03-30 16:36:30

我正在使用react-router。我想检测我来自哪里的上一页(在同一个应用程序中)。我的上下文中有路由器。但是,我在路由器对象上看不到任何属性,例如“以前的路径”或历史记录。我该怎么做?

6个回答

您可以使用<Link>组件传递状态,在本例中为路径名:

<Link to={{pathname: '/nextpath', state: { prevPath: location.pathname }}}>Example Link</Link>

然后您可以prevPaththis.props.location.state下一个组件中访问

你也可以做同样的事情 browserHistory.push()
2021-05-27 16:36:30
巧妙的把戏。但是,如果您不小心,就会有明显的问题。页面A将用户发送到B带有 state 的页面{pathname: pathB, state: { prevPath: pathA}}当在页面上B并且用户导航到上一页时,传递类似结构的状态,您可以看到问题。
2021-05-28 16:36:30
是的,状态是一个非常糟糕的答案
2021-05-30 16:36:30
使用state对我来说是有问题的,因为它可以在刷新后继续存在。我在填写表格后在“谢谢”页面上使用它。如果人们不是来自原始表单,我不希望他们访问此页面。还是我做错了?
2021-06-04 16:36:30
这将重定向到运行在端口 3000 上的 API 主机,反应应用程序在 3001 上。如何解决这个问题?
2021-06-11 16:36:30

您可以在componentWillReceiveProps生命周期方法中保存以前的路径该逻辑文档的故障排除部分提供的示例非常接近react-router

<Route component={App}>
  {/* ... other routes */}
</Route>

const App = React.createClass({
  getInitialState() {
    return { prevPath: '' }
  },

  componentWillReceiveProps(nextProps) {
    if (nextProps.location !== this.props.location) {
      this.setState({ prevPath: this.props.location })
    }
  }
})

最近,从状态访问它。

我使用 componentWillUnmount 来设置状态,但是如果我移动到其他组件,除非我将它传递给组件,否则我无法访问该状态。
2021-06-09 16:36:30
很高兴帮助你!
2021-06-15 16:36:30
@AlexandrLazarev 功能组件呢?你介意更新你的答案吗?提前致谢。
2021-06-17 16:36:30
它对我不起作用。我使用 <Link to /> 在我的应用程序中导航,并且当我单击组件中的任何链接时 componentWillReceiveProps 不会运行。
2021-06-18 16:36:30
谢谢。我用路径和路径名推送了状态。你的解决方案更好。
2021-06-19 16:36:30

如果您正在使用,react-router-redux您可以创建一个减速器,该减速器与 react-router-redux 调度的事件挂钩。

export default function routerLocations(state = [], action) {
  switch (action.type) {
    case "@@router/LOCATION_CHANGE":
      return [...state, action.payload]
    default:
      return state;
  }
}
如果你正在使用connected-react-router你可以使用import { LOCATION_CHANGE } from 'connected-react-router';
2021-05-30 16:36:30
除此之外,您可以导入操作名称 import { LOCATION_CHANGE } from 'react-router-redux';
2021-06-10 16:36:30
@Stuck 它只是@@router/LOCATION_CHANGE在控制台上打印
2021-06-11 16:36:30

不要检查上一页是什么,而是从不同的角度解决问题。将当前页面作为props传递给您要导航到的组件或链接。

在我调用 history.push 或单击链接的上一个页面或组件中,我添加了我所在的当前页面的状态,例如

history.push(`/device/detail`, { from: 'device detail page' } );

然后我可以使用 history.location.state.from 访问上一页的内容

它应该是 history.location.state.from 因为 history.location 没有 from 属性。所以 history.location.from 不应该存在。你可以确认这个@defraggled
2021-05-31 16:36:30
您能否粘贴更详细的答案,以便人们可以从您的精彩答案中受益?现在它不是在一个有用的状态,因为没有事情如何联系在一起的例子..任何人都愿意改进这个答案???
2021-05-31 16:36:30
你的回答应该得到 100 票,谢谢:D
2021-06-03 16:36:30
谢谢!出于某种原因,我不知道在哪里可以找到,from但多亏了你,我找到了它。const history = useHistory(); console.log(history.location.state.from);
2021-06-08 16:36:30
history.location.from不是history.location.state.from@Quirzo
2021-06-09 16:36:30

使用react-router 的useHistory钩子,在功能组件的无状态状态下跳转到之前的路径。有关更多信息,请点击链接https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/hooks.md#useroutematch

import { useHistory } from "react-router-dom";

function demo () {
    let history = useHistory();
    const goToPreviousPath = () => {
        history.goBack()
    }
    return (
      <div>
        <Button
          onClick={goToPreviousPath}
        >
          Back
        </Button>
      </div>
    ):
}
这提供了一种向后导航的方法。但它没有提供访问先前 URL 的方法,这正是问题所问的
2021-06-02 16:36:30
现在不是 2021 年了。我相信他们已经更新了它并且他们已经修复了这个错误 @Dev。我在我的代码中使用了上面的代码,并尝试多次重新加载页面,但效果很好。
2021-06-06 16:36:30
您应该注意,如果您重新加载页面,则新的先前路径将成为您刚刚重新加载的路径。如果你重新加载 2 次然后尝试history.goBack(),你会遇到同一个页面两次,这不是你通常想要的。
2021-06-15 16:36:30
这种方法的问题在于它保留了 </> 浏览器按钮,而 > 变为启用状态。如果您想始终在最新页面(> 禁用),但只是将上一个屏幕显示为最新页面,这将不起作用。
2021-06-20 16:36:30