reactjs - 除非刷新页面,否则 React Router 将不会渲染 Route 组件

标签 reactjs redux react-router

看来我的应用程序不会渲染传递给 <Route /> 的组件除非我刷新页面。我可能做错了什么?

组件/App/index.jsx

// dependencies
import React from 'react';
import PropTypes from 'prop-types';
import { Provider } from 'react-redux';
import { BrowserRouter as Router } from 'react-router-dom'

// components
import Header from '../Header';

// containers
import SidebarContainer from '../../containers/SidebarContainer';
import MainContainer from '../../containers/MainContainer';

const App = ({store}) => (
  <Provider store={store}>
    <Router>
      <div className="wrapper">
        <Header />
        <div className="container-fluid container-fluid--fullscreen">
          <div className="row row--fullscreen">
            <SidebarContainer />
            <MainContainer />
          </div>
        </div>
      </div>
    </Router>
  </Provider>
);
App.propTypes = {
  store: PropTypes.object.isRequired,
};

export default App;

containers/MainContainer.jsx

// dependencies
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { Route } from 'react-router-dom'

// components
import Dashboard from '../components/Dashboard';
import List from '../components/List';

// containers
import LoginContainer from './LoginContainer.jsx'

class Main extends Component {
  render() {
    console.log(this.props)
    return(
      <div className="wrapper">
        <Route exact path="/" component={Dashboard} />
        <Route path="/login" component={LoginContainer} />
        <Route path="/users" component={List} />
      </div>
    );
  }
}

const mapStateToProps = (state) => {
  return {
    token: state.authentication.token,
  };
};

const MainContainer = connect(mapStateToProps, null)(Main);

export default MainContainer;

所以当我点击<Link to="/users" />时看起来是这样的组件我的路径更改为 http://localhost:3000/users但该组件不会从 Dashboard 发生变化至List

我还注意到,当我 console.log this.props 时来自MainContainer我没有看到任何与路由器相关的内容,例如 this.props.location.pathname --也许我没有正确构建我的应用程序?

最佳答案

在 github 上浏览 React-router 问题页面后,我发现了这个线程:https://github.com/ReactTraining/react-router/issues/4671

看起来好像 redux connect 方法阻塞了react-router包所需的上下文。

话虽这么说,解决这个问题的方法是用 withRouter() 包装所有包含路由器组件的 redux 连接组件,如下所示:

containers/MainContainer.jsx

// dependencies
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { Route, withRouter } from 'react-router-dom' // IMPORT withRouter

// components
import Dashboard from '../components/Dashboard';
import List from '../components/List';

// containers
import LoginContainer from './LoginContainer.jsx'

class Main extends Component {
  render() {
    console.log(this.props)
    console.log(this.context)
    return(
      <div className="wrapper">
        <Route exact path="/" component={Dashboard} />
        <Route path="/login" component={LoginContainer} />
        <Route path="/users" component={List} />
      </div>
    );
  }
}

const mapStateToProps = (state) => {
  return {
    token: state.authentication.token,
  };
};

// WRAP CONNECT METHOD
const MainContainer = withRouter(connect(mapStateToProps, null)(Main)); 

export default MainContainer;

关于reactjs - 除非刷新页面,否则 React Router 将不会渲染 Route 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46123988/

相关文章:

javascript - React 6 导航和点击没有按预期工作

javascript - 使用带有 href 按钮的 React-router

javascript - React Router 开关组件匹配

html - 如何在React中运行 "index.html"

reactjs - Jest : Received number of calls: 0

css - 自定义 className 语义 ui react

reactjs - 为应用程序创建单个 MobX 商店的最佳方式是什么?

angular - 如何在 Angular 6 应用程序中使用 React 组件

javascript - 在没有任何 mapstatetoprops 的 redux 中连接,并且仍然将东西作为 props

javascript - redux.js 中的 fetch(url) 使用错误的端口