结合2个不同项目的2个redux商店

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结合2个不同项目的2个redux商店相关的知识,希望对你有一定的参考价值。

首先,我是React&Redux的初学者。

我正在尝试将组件从一个项目转移到另一个项目。我把一个项目作为npm包,所以我可以直接从这个项目导入。问题是我在我的主项目中使用了一个商店,而我的npm包也使用了商店。这导致状态未定义,因为我只给一个商店提供商。

这是我的主项目的index.js,我知道你不能有2个提供商,但我想指出我正在寻找两个商店的功能:

import { guiReducer, intlInitialState } from 'second-project';
const secondStore = createStore(guiReducer, intlInitialState);
const store = configureStore();

render(
<Provider store={store}>
 <Provider store={secondStore}
  <Router>
   <App />
  </Router>
 </Provider>
</Provider>

这是configureStore.js:

import rootReducer from '../reducers';

function configureStoreProd(initialState){
 return createStore(
  rootReducer,
  initialState,
  applyMiddleware(thunk)
  );
}

const configureStore =
  process.env.NODE_ENV === 'production' ? configureStoreProd : configureStoreDev;


export default configureStore;

rootReducer是主项目的组合减速器,guiReducer是第二个项目的组合减速器。 rootReducer的示例代码(类似于guiReducer):

const appReducer = combineReducers({
 loggedIn,
 courses,
 lessons,
 organisation,
});

const rootReducer = (state,action) => {
 if (action.type === LOGOUT) {
   state = initialState;
 }
 return appReducer(state,action);
};

export default rootReducer;

我还试图结合root / gui-reducers并创建一个像这样的新商店(configureStore.js):

function configureCombinedStoreProd(initialState){
 return createStore(
   combineReducers({
    rootReducer,
    guiReducer,
   }), initialState, applyMiddleware(thunk)
 );
}

const configureCombinedStore = 
 process.env.NODE_ENV === 'production' ? configureCombinedStoreProd : 
   configureCombinedStoreDev; 

export {configureCombinedStore as configureCombinedStore };

提前致谢。

答案

我目前通过使用来自第二个项目的<Provider store={store}>在App.js中包装组件来解决这个问题,而在index.js中“App”包含在主项目中的提供程序中。不确定这是否是最佳做法。

另一答案

我建议你避免在npm包中保存另一个商店。相反,只包含npm包中所需的组件,使它们接受与“store”不同的属性,并将旧项目的reducers复制到“reducers”文件夹中。相反,如果你使用“duck pattern”,你可能也想在npm包中保存旧的reducer(只有减压器,而不是商店!)并在你的新商店里调用combineReducers之类的东西时将它们导入你的商店.js文件。

以上是关于结合2个不同项目的2个redux商店的主要内容,如果未能解决你的问题,请参考以下文章

redux的详细介绍和使用!

如何在recyclerview不同的项目点击上打开几个不同的片段?

如何将 2 个 vuex 商店合并为一个商店

提供商无法访问redux商店

React 组件不调用 connect redux 函数

从 2 个不同片段的 sqlite 中的 2 个表中获取信息