可以实现多实例吗
wqy8593521 opened this issue · 8 comments
当发布一个命令后 所有组件都会同步更新状态 状态是全局唯一的 能否实现多实例 组件不同实例下状态互不影响
Thank feedback. We will check it later:-)
@wqy8593521 有很多种方法,要看具体你的场景。
- 分别使用
<RemeshRoot />
把两个区域间隔开,就得到了两个独立的RemeshStore
了。其中,它们内部的所有 domain 实例都是互不影响的 - 使用带参数的
RemeshDomain(arg)
,如MyDomain('id1')
和MyDomain('id2')
对应的是两个不同的domain
实例。
@wqy8593521 有很多种方法,要看具体你的场景。
- 分别使用
<RemeshRoot />
把两个区域间隔开,就得到了两个独立的RemeshStore
了。其中,它们内部的所有 domain 实例都是互不影响的
如果是兄弟层级的需要隔离开,用两个 <RemeshRoot />
可以,如果想要嵌套形式的隔离的话,内层的会遮蔽祖先层级。
是否考虑像 react-redux
那样,可以自定持有 store
的 ReactContext
并且能有 createUseRemeshXXX(Context)
这样二次创造 Hook 的能力?
@ninesunsabiu 嵌套式隔离是指什么形式?部分 domain 来自内层,部分 domain 来自外层?
对于这种场景,可以通过添加指定的 scope key
到 domain arg
里,也就是说在内层使用的是 MyDomain({ scope: 'inner', ...others })
,而外层使用的是 MyDomain({ scope: 'outer' , ...others})
。这样两个 domain 分别是不同的实例。
通过参数化 domain 去管理多实例,用参数设计来管理 scope 问题。这个策略更加灵活,因为它们仍在同一个 store 里,可以互相通讯(domain.getDomain)和组合。
嵌套式隔离是指什么形式?部分 domain 来自内层,部分 domain 来自外层?
嵌套形式具体是指
<RemeshRoot store={storeOuter}>
... scope A
<NestComponent>
<RemeshRoot store={storeInner}>
... scope B
</RemeshRoot>
</NestComponent>
</RemeshRoot>
之所以会顺便提出这个想法是因为在我们产品中正在经历一场 单一 store 到 多 store 的 redux store
重构。产品项目里之前的单一 store 持续膨胀,create-store
引入了非常多的模块,因此我们想把一些有明显边界、可延后加载的模块 “局部化”,同时还需要使得之前的代码最小变更。
采取的方案就是 独立出另一个 redux store
然后把作用域下的 useSelector 和 useDispatch 给替换成绑定了新 Context 的 Hook。
因为在 scope B
中,依然会在 UI 界面上使用一部份 scope A
的 command 和 state,所以,如果没有新的 Context 的话,在 scope B
中的 useSelector
和 useDispatch
就会被 scope B
的 ReactContext
遮蔽
但是 remesh
这边的情况似乎不需要这样,主要因为 store 并不依赖 domain 来创建,所以不会有我们产品项目中的问题。我们项目中主要需要的不是同一个 domain - logic 需要在 outer 和 inner 同时存在的问题,而是 code 需要分离的问题
@ninesunsabiu 明白你的意思了,对于 redux
单一 store
问题,我们在 remesh
之前的方案 pure-model
(现在仍在多个项目中广泛使用),也给出了基于 redux
的解决方案。
可以点击pure-model,权当参考~
@ninesunsabiu 明白你的意思了,对于
redux
单一store
问题,我们在remesh
之前的方案pure-model
(现在仍在多个项目中广泛使用),也给出了基于redux
的解决方案。可以点击pure-model,权当参考~
感谢指路。刚才大致浏览了一下,在 pure-model 这个方案下,和我们目前采用的方案类似的应该就是 useReactModel 这个 API。在子组件再具体使用 Model,而不是在 Root 直接静态 import Model。因为子组件有可能是一个 LazyComponent 所以这样的做法对 Code-Splitting 应该有些意义。