为何添加admin和setAdmin依赖后useEffect仅执行一次?
问题解析:为什么你的useEffect只执行一次?
你之所以产生误解,核心是没搞清楚两个关键细节:useLoaderData返回的admin什么时候会更新引用,以及状态管理库中setAdmin的引用稳定性。
1. useLoaderData的admin引用不会随组件重渲染变化
React Router的useLoaderData返回的数据,只有当对应的loader函数重新执行时,才会生成新的对象引用。你的Root组件作为路由根组件,除非出现以下场景:
- 页面刷新
- 路由参数变化触发loader重新运行
- 主动调用
reload方法刷新loader
否则loader不会重新执行,admin始终是同一个对象引用——哪怕Root组件因为其他组件变化而重渲染,useLoaderData返回的还是原来的admin,依赖数组里的admin没变化,useEffect自然不会重复触发。
2. setAdmin是稳定的引用
从useAdminStore的写法来看,你应该用的是Zustand这类现代状态管理库,这类库的setter方法(比如setAdmin)是缓存过的稳定引用,不会随组件重渲染而改变。所以它不会成为useEffect重复执行的触发条件。
验证方法
如果想测试useEffect是否会在admin变化时触发,可以手动修改loader返回不同的admin对象(比如临时加个随机属性),或者在路由跳转时让loader重新执行,这时你会看到useEffect再次触发。
内容的提问来源于stack exchange,提问作者Zwel
相关产品推荐
相关产品推荐

