javascript - React-Router@4 : Routes not switching normally with React-Hot-Loader@3. beta.6

标签 javascript reactjs webpack react-router react-hot-loader

我正在使用 React-Router@4React-Hot-Loader@3.beta.6 以及 Webpack@2^< 构建 React 应用程序.

奇怪的事情发生了,

我在routes.js文件中声明了这样的路由

/* global __DEV__ */
import React from 'react';
import { Switch, Route, Link } from 'react-router-dom';

// import asyncRoute from './asyncRoute';
// const Welcome = asyncRoute(() => import('../views/Welcome'));
// const About = asyncRoute(() => import('../views/About'));
// const Topics = asyncRoute(() => import('../views/Topics'));

import Welcome from '../views/Welcome';
import About from '../views/About';
import Topics from '../views/Topics';

const Routes = ({ ...properties }) => {
  return (
    <div>
      <div>
        Dummy Links to check Code Splitting
        <ul>
         <li><Link to="/">Welcome</Link></li>
         <li><Link to="/about">About</Link></li>
         <li><Link to="/topics">Topics</Link></li>
       </ul>
      </div>
      <Switch>
        <Route exact path="/" component={Welcome} />
        <Route path="/about" render={(props) => <h3>About</h3>} />
        <Route path="/topics" component={Topics} />
      </Switch>
    </div>
  );
}

export default Routes;

// This will enable/force Hot Module replacement on __DEV__ environment.
// if (__DEV__) {
//   require('../views/Welcome');
//   require('../views/About');
//   require('../views/Topics');
// }

我的 Main.js 文件如下所示,

import React from 'react';
import ReactDOM from 'react-dom';
import { AppContainer } from 'react-hot-loader';

import configureStore from './redux/configureStore';

const initialState = window.__INITIAL_STATE__;
const store = configureStore(initialState);

import './styles/main.css';

import Root from './views/Root';

function render(Root) {
  ReactDOM.render(
    <AppContainer>
      <Root store={ store } />
    </AppContainer>,
    document.getElementById('root')
  );
}

if (module.hot) {
  module.hot.accept('./views/Root', () => {
    const nextRoot = require('./views/Root').default;
    render(nextRoot);
  });
}

render(Root);

没有发生正常的路线切换,您可以在下面看到附加的视频

https://share.viewedit.com/XbjKCUjbcvhcL3xRXm8kX7

从视频中,看起来通常单击链接不会重新渲染,但是当我更改某些组件中的某些内容时,在切换路径时会发生 react 热加载器修补渲染。

我的项目就在这条路上 https://github.com/bboysathish/react-boilerplate/tree/dev

如何解决这个问题?

最佳答案

事实上,事实证明这是上下文传播的阻塞。

请执行以下差异以使您的应用程序按您期望的方式工作:

diff --git a/app/routes/Routes.js b/app/routes/Routes.js
index 2b9b787..45dbcbf 100644
--- a/app/routes/Routes.js
+++ b/app/routes/Routes.js
@@ -22,7 +22,7 @@ const Routes = ({ ...properties }) => {
          <li><Link to="/topics">Topics</Link></li>
        </ul>
       </div>
-      <Route path="/" component={Welcome} />
+      <Route path="/" exact component={Welcome} />
       <Route path="/about" component={About} />
       <Route path="/topics" component={Topics} />
     </div>
diff --git a/app/views/App.js b/app/views/App.js
index 405414c..c712c3a 100644
--- a/app/views/App.js
+++ b/app/views/App.js
@@ -1,5 +1,6 @@
 import React, { Component } from 'react';
 import { connect } from 'react-redux';
+import { withRouter } from "react-router-dom";

 class App extends Component {
   render() {
@@ -12,4 +13,4 @@ class App extends Component {
   }
 }

-export default connect()(App);
+export default withRouter(connect()(App));

让我们深入探讨一下:

-export default connect()(App);
+export default withRouter(connect()(App));

这将确保您连接的组件能够响应上下文更改。 React-redux 不会在上下文更改时重新渲染组件,这是一个已知问题。

-      <Route path="/" component={Welcome} />
+      <Route path="/" exact component={Welcome} />

这将确保您的 Welcome 组件仅在确切的 / URL 上呈现。

关于javascript - React-Router@4 : Routes not switching normally with React-Hot-Loader@3. beta.6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43512790/

相关文章:

reactjs - React js 相当于 ng-include

vue.js - 为什么 babelConfig 在 webpack encore 中不起作用?

javascript - Sequelize MYSQL 中的类似字符串匹配

javascript - 通过 WebAssembly 将 Rust Vec<Vec<i32>> 返回给 JavaScript

javascript - 函数声明数组中的对象未定义 - 不!它不是!-?

javascript - Webpack:将动态导入的模块拆分为单独的 block ,同时将库保留在主包中

javascript - 我们是否需要在应用程序中结合 transform-runtime 和 preset-env ?

javascript - 我的 CocoaTouch 应用程序如何响应用户在 UIWebView 中按下 HTML 输入按钮?

javascript - ReactJS - 当子状态改变时更新父状态

javascript - 图像未在 reactjs 中加载