umijs / hox

State sharing for React components.
https://hox.js.org
MIT License
1.45k stars 100 forks source link

用户反馈:执行时机问题 #7

Open brickspert opened 4 years ago

brickspert commented 4 years ago

看一下这个例子:https://codesandbox.io/s/hox-best-practice-w96lz 在 combinedInc 与 combinedDec 的区别只在于调用外部与外部的 setState 的顺序不同,却导致触发的 effect 次数不同(inc 1 次;dec 2 次,并其中一次是错误的),这影响就很大了。

brickspert commented 4 years ago

IMG_1094

正常情况下,是会有两次更新的。 只是 inc 情况下,两次更新被 react 合并到一次执行了。 并不会对真实数据产生任何影响。

zheeeng commented 4 years ago

这是一个额外的心智负担,就一般的 React 经验都会认为在一次合成事件中两次 setState 会被 batchUpdate 并触发一次 effect,现在却不是这样。假设我们需要在 effect 中发送记录日志并发送,两次触发就有问题了。

brickspert commented 4 years ago

这是一个额外的心智负担,就一般的 React 经验都会认为在一次合成事件中两次 setState 会被 batchUpdate 并触发一次 effect,现在却不是这样。假设我们需要在 effect 中发送记录日志并发送,两次触发就有问题了。

我理解不管是 合并还是不合并,只要统一就可以。 全部搞成合并的好像不现实,react 机制限定了。 全部搞成不合并的,可能需要一个 setTimeout,也是很搓的办法。

我们再考虑下。

janryWang commented 4 years ago

是不是只有存在同时调用多次model的API才会导致重复渲染?

brickspert commented 4 years ago

https://codesandbox.io/s/hox-best-practice-49c3l 不会多次渲染的。

3lang3 commented 4 years ago

感觉是多个root fiber合并更新优先级的问题 1.先触发本地state更新再触发其他root更新:不会合并更新 本地update优先级更高 2.先触发其他root更新 再触发本地state更新:会合并batchUpdate,还是因为本地state优先级更高

应该可以换成原生context和prodiver实现

xuxin666666 commented 1 year ago

现在好像解决了,甚至你这里例子的热更新多次触发useEffect的bug也解决了