React redux和React路由器,链接更改不会重新渲染视图[重复]

Posted

技术标签:

【中文标题】React redux和React路由器,链接更改不会重新渲染视图[重复]【英文标题】:React redux and React router,link change does not re render view [duplicate] 【发布时间】:2019-01-13 17:55:15 【问题描述】:

我通过<Route/> 渲染了一些<Link/> 元素和一些相应的组件

<Route/> 正在渲染的组件是 redux connect-ed。 单击链接时,地址栏中的 url 会更改,但呈现的组件视图不会更改。 但是,刷新时会呈现正确的视图。

容器组件的代码(带有路由器和链接的那个)

upload.js

import React,  Component  from "react";
import 
  BrowserRouter as Router,
  Route,
  Switch,
  Redirect,
  Link
 from "react-router-dom";

import FileUpload1 from "./fileUpload1";
import FileUpload2 from "./fileUpload2";
import FileUpload3 from "./fileUpload3";

export default class Uploads extends Component 


  render() 
    return (
      <div>

        <div>
          <Link to=`$this.props.match.url/p`>Upload 1</Link>
        </div>
        <div>
          <Link to=`$this.props.match.url/t`>Upload 2</Link>
        </div>
        <div>
          <Link to=`$this.props.match.url/e`>Upload 3</Link>
        </div>


        <Router>
          <Switch>
            <Route
              path=`$this.props.match.url/p`
              render=props => (
                <FileUploadPassport ...props tabID="1" />
              )
            />
            <Route
              path=`$this.props.match.url/t`
              render=props => <FileUpload2 ...props tabID="2" />
            />
            <Route
              path=`$this.props.match.url/e`
              render=props => <FileUpload3 ...props tabID="3" />
            />
          </Switch>
        </Router>
      </div>
    );
  

这是fileUpload1

import React,  Component  from "react";

import  withRouter  from "react-router-dom";

import  connect  from "react-redux";

class FileUpload1 extends Component 
  constructor(props) 
    super(props);
    this.state = ;
  



  componentWillMount() 
    console.log("Mounting");

  

  componentDidMount() 
    console.log("mounted");
  

  render() 
    return (
      <div>
        <h1>Hello</h1>
      </div>
    );
  

const mapStateToProps = (state, ownProps) => (

  test: state.initState.testStuff
);

export default withRouter(
  connect(mapStateToProps,null)(FileUpload1)
);

我尝试使用withRouter 包装fileupload1.js 文件的默认导出,但无济于事。 如何让FileUpload1 组件在单击相应的&lt;Link/&gt; 时呈现?

【问题讨论】:

已经尝试过标记为重复的问题的答案中建议的解决方案(如问题中所述)。这就是我问这个的原因。为什么这被标记为重复? :( 【参考方案1】:

Link 组件从 Router 上下文更改 history,因此您需要确保 Link 组件在您的 Router 中呈现。

最好只有一个BrowserRouter component at the top of your app。

export default class Uploads extends Component 
  render() 
    return (
      <Router>
        <div>
          <div>
            <Link to=`$this.props.match.url/p`>Upload 1</Link>
          </div>
          <div>
            <Link to=`$this.props.match.url/t`>Upload 2</Link>
          </div>
          <div>
            <Link to=`$this.props.match.url/e`>Upload 3</Link>
          </div>
          <Switch>
            <Route
              path=`$this.props.match.url/p`
              render=props => <FileUploadPassport ...props tabID="1" />
            />
            <Route
              path=`$this.props.match.url/t`
              render=props => <FileUpload2 ...props tabID="2" />
            />
            <Route
              path=`$this.props.match.url/e`
              render=props => <FileUpload3 ...props tabID="3" />
            />
          </Switch>
        </div>
      </Router>
    );
  

【讨论】:

这是针对所有情况还是仅针对特定情况? @DhavalJardosh 我不太确定我明白你在问什么,抱歉。是的,Link 组件 should get the history from context。 我问Link 总是包裹在Router? 中。因为,我使用没有RouterLink 作为包装器并且它正在工作。我很好奇这是否不是最佳做法。顺便说一句,我会检查您提供的链接。谢谢。

以上是关于React redux和React路由器,链接更改不会重新渲染视图[重复]的主要内容,如果未能解决你的问题,请参考以下文章

React Redux 状态将在使用 Nginx 更改路由时初始化

React,redux 组件不会在路由更改时更新

触发 Redux 操作以响应 React Router 中的路由转换

React 路由器更改 url 但不更改页面加载

将Redux SubApp与React Router配合使用

为一些 Redux 状态更改添加 url 路由