react-router或链接未呈现

IT技术 reactjs react-redux react-router-redux react-router-dom
2021-05-07 19:24:19

我在 redux 应用程序中使用 react-router-dom。

这是我在 index.js 中的初始设置:

ReactDOM.render(

  <Provider store={store}>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </Provider>

  , document.getElementById('root'));

然后在我的 App.js 中,我有:

render() {
    return (
      <div className="App">
        <Route exact path="/" render={ () => {
          return (
              <div>
                {
                  this.props.categories.map((category)=>{
                    console.log('category', category)
                    return (
                          <Link key={category.name} to="/category"  >{category.name}</Link>
                    )
                  })
                }
              </div>
          )

          }}
        />

        <Route path="/category" render={ () => {
          console.log('category path this.props', this.props)
          return (<p>Category is whatever</p>)
        }}
        />

      </div>
    );
  }

我认为每当我单击显示的任何链接时,浏览器都会自动知道如何呈现新的路由路径/类别,但由于某种原因,它不会。

我究竟做错了什么?

4个回答

Dane 的上述帖子有解决方案。但本着更清晰地呈现解决方案的精神,我将复制并粘贴使 react router 与 redux 和其他中间件兼容的相关代码。

import { withRouter } from 'react-router-dom'



export default withRouter(connect(
  mapStateToProps,
)(App))

来自 React Router 文档,

通常,React Router 和 Redux 一起工作得很好。但有时,应用程序的组件可能会在位置更改时不更新(子路由或活动导航链接不更新)。如果出现这种情况:

  1. 该组件通过 connect()(Comp) 连接到 redux。
  2. 该组件不是“路由组件”,这意味着它不会像这样呈现:<Route component={SomeConnectedThing}/>

问题是 Redux 实现了 shouldComponentUpdate 并且如果它没有从路由器接收props,则没有任何迹象表明任何事情发生了变化。这很容易解决。找到连接组件的位置并将其包装在withRouter.

所以也许这是使用renderprops的问题所以:

  1. 替换rendercomponent, 或
  2. 尝试他们的解决方案,withRouter(即使在那里你也必须把它们变成组件)

https://reacttraining.com/react-router/core/guides/redux-integration/blocked-updates

就我而言,这工作正常。如果您将导入路由器并将两者链接在一起。

import { BrowserRouter as Router, Link } from "react-router-dom";

Link 和 Router 都是强制性的。

不行!

import { BrowserRouter as Link } from "react-router-dom";

在我的情况下工作。

import { BrowserRouter as Router, Link } from "react-router-dom";