【问题标题】:Navigate in code with react-router-dom 4.0?使用 react-router-dom 4.0 在代码中导航?
【发布时间】:2017-08-22 06:13:29
【问题描述】:

看看this video,react 路由器似乎很容易使用,但我找不到如何在我的代码中导航,因为我想在单击 div 时链接而不使用<Link>

我搜索了 StackOverflow,但没有找到任何适用于 4.0 的答案。尝试从this question 导入 browserHistory 会给出未定义(在安装 'react-router' 和 'react-router-dom' 之前和之后):

import { browserHistory } from 'react-router';
console.log('browserHistory:', browserHistory);

我还在某处看到有一个“上下文”可以访问,但这显示了“匹配”的值而不是“上下文”:

<Route path="/" render={({ match, context}) => {
    console.log('match:', match);
    console.log('context:', context);

编辑

在开发工具中,我可以看到“Router”有一个历史属性,所以当我添加它时,我可以得到它:

<Route path="/" render={({ match, context, history}) => {

有没有办法从路线外到达这里?例如,导航栏组件将导航到其他组件,但不在 Route 本身内...

【问题讨论】:

标签: react-router react-router-v4


【解决方案1】:

如果我理解您的问题,这就是您以编程方式创建链接的方式。

    class Test extends React.Component {

      handleClick() {
        console.log(this.context);
        this.context.router.history.push('/some/path');
      },

      render() {

        return (
          <div onClick={handleClick}>
            This is div.
          </div>
        )
      }
    }

    Test.contextTypes = {
      router: React.PropTypes.object.isRequired
    }

    ReactDOM.render(
      <Test />,
      document.getElementById("app")
    );

【讨论】:

  • “上下文”从何而来?我在“应用”组件的反应开发工具中没有看到它,但是当我记录它时,我在控制台中看到一个空对象。
  • 嗯...this.context 对我来说是未定义的...组件是否必须在 &lt;Route&gt; 内?
  • @JasonGoemaat this.context 是通过向组件添加 contextTypes 来设置的:Test.contextTypes = { router: React.PropTypes.object.isRequired }
【解决方案2】:

不得不更多地阅读文档。 history 对象仅使用Route 上的component(或其他)属性作为属性传递。显然需要包含'history'包并使用createBrowserHistory并将其传递给Router,然后在Route中指定组件。我认为这应该可以正常工作,因为没有指定 exact...

import { createBrowserHistory } from 'history';
const history = createBrowserHistory();
ReactDOM.render( (
    <Router history={ history }>
      <Route path="/" component={ App } />
    </Router>
  ),
  document.getElementById('root')
);

在我刚刚在&lt;Router&gt; 中拥有&lt;App/&gt; 并且无法访问这些属性之前。

【讨论】:

    【解决方案3】:

    你为什么不把你的 div 包裹在链接中,而不是试图绕过它,让你的生活更轻松?

        <Link to="/" >
           <div className="to-component">go to component</div>
        </Link>
    

    【讨论】:

    • 这似乎是解决问题的最简单方法,我来到这里时遇到了同样的问题。我想知道使用这种方法是否有缺点。
    猜你喜欢
    • 1970-01-01
    • 2022-06-22
    • 1970-01-01
    • 2020-07-09
    • 2018-11-09
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 2018-01-27
    相关资源
    最近更新 更多