小编典典

如何在不同的商店设置多个提供商?

reactjs

我目前正在研究项目,但遇到了问题。我希望以与不同提供商和商店的不同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是我需要的东西。

根据文档将商店分隔为多个子应用。但是我不能同时使用全球商店和本地商店。


阅读 261

收藏
2020-07-22

共1个答案

小编典典

这个 React
Redux部分仅解决多个同级存储。

React Redux 6已更改为使用React上下文API而不是旧版Context。Redux
Provider使用React上下文Provider为连接的组件提供状态。上下文API
Provider会覆盖parent所提供的值是很自然的Provider,因此Provider连接的组件将只考虑最内层的值。

如果存在多个嵌套存储,则它们可以具有自己的上下文,必须在Redux Provider和中指定它们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 ...
2020-07-22