如何使用 react-router 和 ES6 类模拟 window.location

IT技术 reactjs react-router
2021-04-02 19:15:33

我正在使用 react-router,所以我在<Link />整个应用程序中使用该组件作为我的链接,在某些情况下我需要根据用户输入动态生成链接,所以我需要类似的东西 window.location,但没有页面刷新。

我发现了这个小笔记 - (https://github.com/rackt/react-router/issues/835) - 我尝试使用,this.context.router.transitionTo(mylink)但我遇到了上下文问题......

这导致我(https://github.com/rackt/react-router/issues/1059),但是上下文返回和空对象,所以当我尝试做类似的事情时:this.context.router.transitionTo(mylink);我得到Cannot read property 'transitionTo' of undefined(如果我尝试做类似 set this.context = 构造函数中的上下文)。

不要拖延,但我也厌倦了过多地混淆上下文,因为它是故意没有记录的,因为它仍在进行中,所以我已经阅读了。

有没有人遇到过类似的问题?

6个回答

在使用 react router 浪费时间之后,我终于切换到基本的 javascript。

  1. 为您的重定向创建一个组件:

    路由路径="*" 组件={NotFound}

  2. 在组件中使用 window.location 重定向:

     componentDidMount() {
          if (typeof window !== 'undefined') {
               window.location.href = "http://foo.com/error.php";
          }
     }
    
这个问题被标记为 react-router——如果你主张不使用该工具,你应该详细解释为什么它不起作用
2021-06-05 19:15:33
不要陷入认为图书馆应该规定如何做所有事情陷阱如果你想用 JavaScript 中的位置做一些事情,你可以使用 window.location。没有理由为什么 react-outer 应该有任何不同。
2021-06-15 19:15:33

在这里找到了一个解决方案:https : //github.com/rackt/react-router/issues/975,在这里:https : //github.com/rackt/react-router/issues/1499

在构造函数中需要:

class SidebarFilter extends React.Component {

    constructor(props, context) {
        super(props, context);

还需要添加一个静态属性:

SidebarFilter.contextTypes = {
  router: React.PropTypes.func.isRequired
};

然后我可以打电话:

this.context.router.transitionTo(/path-to-link);

如果你在 React-router 上使用 browserHistory,生活就简单多了。

import {browserHistory} from "react-router";

functionName() {
 browserHistory.push("/path-to-link");
}
使用 browserHistory 的方式已经改变。stackoverflow.com/questions/43822589/...
2021-05-23 19:15:33
错误:“react-router”不包含名为“browserHistory”的导出。
2021-05-24 19:15:33

看一下Navigationreact-router中的mixin。http://rackt.github.io/react-router/#Navigation

从文档:

var Navigation = require('react-router').Navigation;

React.createClass({
  mixins: [Navigation],

  render: function() {
    return (
      <div onClick={() => this.transitionTo('foo')}>Go to foo</div>
      <div onClick={() => this.replaceWith('bar')}>Go to bar without creating a new history entry</div>
      <div onClick={() => this.goBack()}>Go back</div>
    );
  }
});
谢谢@paulshen。不幸的是我使用的是 ES6 类,所以我不能使用 mixin。我不确定这是否可能,但我正在尝试导入 Navigation 方法,例如import {Navigation} from 'react-router'......试图看看这是否可能,this.context在 transitionTo 中遇到了一些我现在试图弄清楚的问题。
2021-06-17 19:15:33

在这种情况下,我通常使用hashHistorybrowserHistory取决于您使用的内容并简单地调用hashHistory.push(<url>). 如果您使用的是 ES6 类,您还可以使用这里withRouter提到的 react-router 提供Hoc 这个高阶组件在你的组件中公开了一个名为. 使用此props,您可以使用.routerthis.props.router.push(<url>)

如果您必须从上下文中使用路由器,则必须提供@Ben 的回答中提到的上下文类型。

链接失效了,我今天遇到了类似的问题,现在有更好的解决方案吗?
2021-06-06 19:15:33