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

Posted

技术标签:

【中文标题】如何使用 react-router 和 ES6 类模拟 window.location【英文标题】:How to emulate window.location with react-router and ES6 classes 【发布时间】:2015-10-10 22:11:28 【问题描述】:

我正在使用 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(如果我尝试执行设置 this.context = context在构造函数中)。

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

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

【问题讨论】:

【参考方案1】:

在用 react 路由器浪费时间之后,我终于切换到基本的 javascript

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

    Route path="*" component=NotFound

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

     componentDidMount() 
          if (typeof window !== 'undefined') 
               window.location.href = "http://foo.com/error.php";
          
     
    

【讨论】:

问题被标记为 react-router -- 如果您主张不使用该工具,您应该详细解释为什么它不起作用 不要落入trap of thinking a library should prescribe how to do everything。如果你想在 JavaScript 中对位置做一些事情,你可以使用 window.location。 react-outer 没有任何不同的理由。【参考方案2】:

在此处找到解决方案: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);

【讨论】:

【参考方案3】:

如果你为 React-router 使用 browserHistory,生活就更简单了。

import browserHistory from "react-router";

functionName() 
 browserHistory.push("/path-to-link");

【讨论】:

错误:“react-router”不包含名为“browserHistory”的导出。 浏览器历史的使用方式发生了变化。 ***.com/questions/43822589/…【参考方案4】:

看看来自 react-router 的 Navigation 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 类,所以我不能使用 mixins。我不确定是否可能,但我正在尝试导入 Navigation 方法,例如import Navigation from 'react-router'... 试图看看这是否可能,在我现在想弄清楚的 transitionTo 中遇到this.context 的一些问题。【参考方案5】:

在这种情况下,我通常使用hashHistorybrowserHistory,具体取决于您使用的内容,然后只需调用hashHistory.push(&lt;url&gt;)。如果您使用的是 ES6 类,您也可以使用 react-router 提供的 withRouter Hoc,如提到的 here。这个高阶组件在您的组件中公开了一个名为 router 的道具。使用此道具,您可以使用 this.props.router.push(&lt;url&gt;) 重定向。

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

【讨论】:

链接失效了,我今天也遇到了类似的问题,请问现在有没有更好的解决方案?【参考方案6】:

使用react-router-dom中的Link,在我的sn-p中我使用的是material-ui &lt;Button&gt;

import Link from "react-router-dom";
    
<Button color="primary" 
to="/join" component=Link>
Join a Room
</Button>

【讨论】:

【参考方案7】:

使用useHistory获取历史对象并推送到它以更改url

import  useHistory  from 'react-router-dom';

export default function ModificarUsuario( url ) 
  const history = useHistory();
  
  function newRoute()
    history.push('/my-route')
  

【讨论】:

请说明您的短代码被截断以及如何使用。

以上是关于如何使用 react-router 和 ES6 类模拟 window.location的主要内容,如果未能解决你的问题,请参考以下文章

Webpack babel es6 给我 react-router 1.0“找不到模块”的错误?

如何在 React-Router 2.5 中创建动态链接到属性

ES6 解构和模块导入

如何使用链接(react-router)将道具从一个页面传递到类组件

如何使用组件类中的 react-router 链接来使用组件中的数据?

React-Router 路由到类组件