首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React-hot-loader不重新渲染组件

React-hot-loader不重新渲染组件
EN

Stack Overflow用户
提问于 2018-02-15 18:07:02
回答 1查看 263关注 0票数 0

我有一个应用程序,它在脚本标记中加载了我的React.js包,为EJS视图提供服务。

我已经按照react- have v3和@next的说明进行了操作,它们都不起作用。控制台中没有错误,组件不会在更改时重新呈现。

以下是我的应用程序入口点:

代码语言:javascript
复制
import 'babel-polyfill';
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';

import getMuiTheme from 'material-ui/styles/getMuiTheme';
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
import injectTapEventPlugin from 'react-tap-event-plugin';
import { AppContainer } from 'react-hot-loader'

import { store } from './routes';

import App from './containers/App';

const render = Component => {
  ReactDOM.render(
    <Provider store={store}>
      <MuiThemeProvider>
        <AppContainer>
          <Component />
        </AppContainer>
      </MuiThemeProvider>
    </Provider>,
    document.getElementById('root'))
};

render(App);
//registerServiceWorker();

// Webpack Hot Module Replacement API
if (module.hot) {
  console.log('module.hot exists');
  module.hot.accept('./containers/App', () => {
    console.log('Reloading app');
    render(App);
  })
}

下面是入口点调用的App文件:

代码语言:javascript
复制
import React from 'react';
import Navigation from '../components/Navigation';
import { hot } from 'react-hot-loader'
import createRoutes from '../routes';

const routes = createRoutes();

const App = () => {
  return ([
    <Navigation key="app-navigation" />,
    <main style={{ height: 'calc(100% - 85px)' }} key="app-main">{routes}</main>
  ])
};

export default hot(module)(App)

这是我的webpack开发配置:

代码语言:javascript
复制
const devBrowserRender = {
    devtool: 'source-map',
    context: PATHS.app,
    entry: {
      app: ['babel-polyfill', 'react-hot-loader/patch',
        './index']
    },
    node,
    devServer: {
      contentBase: PATHS.assets,
      hot: true
    },
    output: {
      path: PATHS.assets,
      filename: '[name].dev.js',
      publicPath: PATHS.public
    },
    module: { rules: rules({ production: false, browser: true }) },
    resolve,
    plugins: plugins({ production: false })
  };

以下是我的JavaScript规则:

代码语言:javascript
复制
  const presets = [["es2015", { "modules": false }], 'react', 'stage-0'];

  const plugins = production ? [
    'transform-react-remove-prop-types',
    'transform-react-constant-elements',
    'transform-react-inline-elements'
  ] : [];

  return {
    test: /\.js$|\.jsx$/,
    loader: 'babel-loader',
    options: {
      presets,
      plugins
    },
    exclude: PATHS.modules
  };

开发者插件:

代码语言:javascript
复制
  if (!production) {
    return [
      new webpack.NamedModulesPlugin(),
      new webpack.HotModuleReplacementPlugin(),
      new webpack.EnvironmentPlugin(['NODE_ENV']),
      new webpack.DefinePlugin(compileTimeConstantForMinification),
      new ExtractTextPlugin({
        filename: '[contenthash].css',
        allChunks: true
      }),
      // new webpack.optimize.UglifyJsPlugin({ compress }),
      new ManifestPlugin({
        fileName: 'manifest.json'
      })
    ];
  }

我假设这是由于对react-hot如何工作的误解,但我在文档或示例中找不到任何其他信息来解释为什么它不能工作。

EN

回答 1

Stack Overflow用户

发布于 2018-02-15 18:50:07

我知道配置这些东西的痛苦。

您需要在您的条目部分中包括下一行

代码语言:javascript
复制
entry: {
  app: [
    'react-hot-loader/patch',
    'webpack-dev-server/client?http://localhost:3000',
    'webpack/hot/only-dev-server',
    './index.js'
  ]
}

然后,在设置babel-loader配置时,需要添加react-hot-loader/babel

代码语言:javascript
复制
const plugins = production ? [
  'transform-react-remove-prop-types',
  'transform-react-constant-elements',
  'transform-react-inline-elements'
] : ['react-hot-loader/babel'];

Here我对此功能有一个简单的配置。

希望能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48804514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档