24

我使用 React + Redux + Webpack + WebpackDevserver。一旦热加载器启动,我所有的减速器都会重置为初始状态。

我可以以某种方式将我的减速器保持在实际状态吗?

我的 Webpack 配置包含:

entry: [
    "./index.jsx"
],
output: {
    filename: "./bundle.js"
},
module: {
    loaders: [
        {
            test: /\.js|\.jsx$/,
            exclude: /node_modules/,
            loaders: ["react-hot","babel-loader"],
         }
    ]
},
plugins: [
    new webpack.HotModuleReplacementPlugin()
]

我的减速器统计数据:

const initialState = {
...
}

export default function config(state = initialState, action) { ...

我通过以下方式启动我的 Webpack Dev-Server:

"start": "webpack-dev-server",
4

4 回答 4

21

假设 Babel 6,你需要做一些事情:

import {createStore} from 'redux';
import rootReducer from '../reducers';

export default function configureStore(initialState) {
  const store = createStore(rootReducer, initialState);

  if(module.hot) {
    // Enable Webpack hot module replacement for reducers
    module.hot.accept('../reducers', () => {
      const nextReducer = require('../reducers/index').default;

      store.replaceReducer(nextReducer);
    });
  }

  return store;
}

您可以在我的redux 演示中看到该方法的实际应用。

于 2016-01-09T19:13:46.087 回答
5

检查与商店创建相关的代码 - createStore(). store 必须建在外面app.js,否则每次 HMR 更新时 ot 都会被 FLUSHED。

错误的:

// app.js

import React from 'react';
import ReactDOM from 'react-dom';
import { hot } from 'react-hot-loader';
import { Provider } from 'react-redux';
import { PersistGate } from 'redux-persist/lib/integration/react';
import { AppWidget } from 'containers';
import createStore from 'store/create-store';

const { store, persistor } = createStore(); // <!--- NEW STORE ON HMR, BUG

const rootElement = window.document.getElementById('appWidget');

const render = (Component) => {
  ReactDOM.render(
    <Provider store={store}>
      <PersistGate loading={null} persistor={persistor}>
        <Component />
      </PersistGate>
    </Provider>,
    rootElement,
  );
};

render(process.env.NODE_ENV === 'development' ? hot(module)(AppWidget) : AppWidget);

正确的:

// app.js

import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { AppWidget } from 'containers';
import store from 'store/create-store';
import { AppContainer } from 'react-hot-loader';

const rootElement = window.document.getElementById('appWidget');

const render = (Component) => {
  ReactDOM.render(
    <AppContainer>
      <Provider store={store}>
        <Component />
      </Provider>
    </AppContainer>,
    rootElement,
  );
};

render(AppWidget);

if (module.hot) {
  module.hot.accept();
}

// create-store.js

import { applyMiddleware, compose, createStore } from 'redux';
import createSagaMiddleware from 'redux-saga';
import thunk from 'redux-thunk';
import rootReducer from './reducers';
import rootSaga from './sagas';

const doCreateStore = () => {
  const sagaMiddleware = createSagaMiddleware();
  const middleware = [
    thunk,
    sagaMiddleware,
  ];

  const store = createStore(
    rootReducer,
    compose(
      applyMiddleware(...middleware),
    ),
  );

  sagaMiddleware.run(rootSaga);

  return store;
};

export default doCreateStore(); // <!-- CREATE AND RETURN STORE, NO BUG

于 2019-09-13T13:26:44.287 回答
0

只需像下面那样在根元素中呈现应用程序的地方塑造您的代码。

商店.js:

export const store = createStore(rootReducer, integrateDevTools)

index.jsx:

这会成功的。


ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root'),
)


if (module.hot) {
  module.hot.accept()
}
于 2020-05-21T19:47:32.520 回答
0

是的,您可以,实际上,如果您使用react-hot-loader,您将获得准确的结果等等。

react-hot-loader将确保仅更新您更改的那三个,并且还将保持 redux 上的状态。

示例:您正在创建一个模式,它从 API 接收一些信息,然后将信息保留在 redux 上,如果您更改文本颜色,您知道您必须等待整个应用程序刷新,然后浏览器呈现,然后您ve打开模态,等待API等。但是使用react-hot-loader,在您更改该颜色后,您的模态仍将打开,并使用您当前的数据,并且只会更新该颜色。

按照包自述文件中的步骤操作:

1 -您需要安装软件包(是的,不需要是开发依赖项,README 解释了更多详细信息)

npm install react-hot-loader

2 -将其添加到 .babelrc

// .babelrc
{
  "plugins": ["react-hot-loader/babel"]
}

3 -hot在文件的第一行导入App.js(是的,在 React、ReactDOM 之上),然后将你的根组件标记为热导出

// App.js
import { hot } from 'react-hot-loader/root';
const App = () => <div>Hello World!</div>;
export default hot(App);

就是这样,现在你应该有一个热重载,只关注最后的更改并为你保留 redux 状态。

OBS:如果您使用钩子,请在文档中查看更多详细信息

于 2020-05-30T20:16:12.923 回答