reto icon indicating copy to clipboard operation
reto copied to clipboard

初学者的一些小疑问

Open nekocode opened this issue 5 years ago • 3 comments

Hi,无意中找到了这个库,发现我最近写的一个库和你的实现原理基本一致 !看来我们的想法高度一致啊哈哈哈!

大概看了下代码,有一处地方有细微的差别:

  • https://github.com/awmleer/reto/blob/master/src/consumer.tsx#L48
  • https://github.com/nekocode/use-shared-state/blob/master/src/index.ts#L77

当 hook 所在组件重新渲染且 deps 参数发生改变时,是否重新订阅会更好呢?

nekocode avatar Jan 25 '20 05:01 nekocode

非常感谢指正~

这里的确有些纰漏,在组件重渲染并更改了 deps 参数时,useEffect 中还是会继续使用旧的 deps 参数。。重新订阅的确是可以的

useEffect(() => {
  // ...
}, [deps])

但是这样可能增加一些不必要性能开销,毕竟 useStore(FooStore, s => [s.id]) 中的 deps 函数每次渲染引用都会变。。

所以也许可以改成:

const depsFnRef = useRef()
depsFnRef.current =deps
useEffect(() => {
  // ...
  // 在这里使用 depsFnRef.current 而不是 deps
}, []) // 这里不需要把 deps 放在数组中了

awmleer avatar Jan 26 '20 10:01 awmleer

BTW,你的 use-shared-state 也写的很棒呀~简单直接~

awmleer avatar Jan 26 '20 10:01 awmleer

感谢回复🙏在你这种固定会订阅的情况下确实像你说这么做会更好~学习到了哈哈哈

nekocode avatar Jan 26 '20 11:01 nekocode