我目前正在研究项目,但遇到了问题。我希望以与不同提供商和商店的不同react子应用程序结束。
到目前为止,我一直在尝试申请两个单独的商店,但没有成功。主要问题是,当我拥有一个全球商店时,一切工作正常,当我尝试将不同的商店应用于不同的路线时,应用程序仅使用它们中的第一个即可。问题是该应用程序将处理易受攻击的数据,因此我必须将其拆分到多个存储中。
全局存储在各个组件之间都可以正常工作,但是当我尝试将它们分开时,它不能正常工作。
所以,这个很好。
const MainTemplateWithRouter = ( <div> <Router> <Provider store={createStore(reducers)}> <Switch> <Route exact path="/" component={DashBoard} /> <Route path="/auth" component={Auth} /> <Route path="/admin-panel" component={AdminPanel} /> <Route path="/project-manager" component={ProjectManager} /> <Route path="/test" component={Test} /> <Route path="*" component={NotFound} /> </Switch> </Provider> </Router> </div> ); ReactDOM.render(MainTemplateWithRouter, document.querySelector('#root'));
完美的解决方案将类似于一个全局商店(用于存储例如当前选择的语言(多语言应用程序)),每个子应用程序一个商店。正如刚才提到的。应用程序将非常庞大,其中包含许多子应用程序,这些子应用程序应存储在不同的商店中。
const MainTemplateWithRouter = ( <div> <Router> <h1>Header with Logo: XXXX</h1> <div> <Link to="/">Home</Link> <br/><br/> </div> <Provider store={createStore(reducers)}> <Switch> <Route exact path="/" component={DashBoard} /> <Route path="/auth" component={Auth} /> <Provider store={createStore(adminPanelReducers)}> <Route path="/admin-panel" component={AdminPanel} /> </Provider> <Route path="/project-manager" component={ProjectManager} /> <Provider store={createStore(testReducer)}> <Route path="/test" component={Test} /> </Provider> <Route path="*" component={NotFound} /> </Switch> </Provider> </Router> </div> ); ReactDOM.render(MainTemplateWithRouter, document.querySelector('#root'));
我究竟做错了什么?是否可以在每个子应用程序中实现一个全球商店和单独商店?如果没有,我可以在全局上下文中存储当前选定的lang并为每个子应用程序创建存储吗?
@编辑
https://redux.js.org/recipes/isolated-redux-sub- apps是我需要的东西。
根据文档将商店分隔为多个子应用。但是我不能同时使用全球商店和本地商店。
这个 React Redux部分仅解决多个同级存储。
React Redux 6已更改为使用React上下文API而不是旧版Context。Redux Provider使用React上下文Provider为连接的组件提供状态。上下文API Provider会覆盖parent所提供的值是很自然的Provider,因此Provider连接的组件将只考虑最内层的值。
Provider
如果存在多个嵌套存储,则它们可以具有自己的上下文,必须在Redux Provider和中指定它们connect:
connect
const GlobalContext = React.createContext(); const AdminContext = React.createContext(); ... <Provider context={GlobalContext} store={globalStore}> ... <Provider context={AdminContext} store={adminStore}> <Route path="/admin-panel" component={AdminPanel} /> </Provider> ... </Provider> ... @connect(globalMapState, null, null, { context: GlobalContext }) @connect(adminMapState, null, null, { context: AdminContext }) class AdminPanel ...
或者兄弟可以使用默认的Redux上下文来避免样板代码:
const GlobalContext = React.createContext(); ... <Provider context={GlobalContext} store={globalStore}> ... <Provider store={adminStore}> <Route path="/admin-panel" component={AdminPanel} /> </Provider> ... </Provider> ... @connect(globalMapState, null, null, { context: GlobalContext }) @connect(adminMapState) class AdminPanel ...