是否需将Zustand Store加入useEffect依赖数组?与Redux对比
关于Zustand Store在useEffect依赖列表中的疑问
首先直接给结论:不需要把整个notify对象加入useEffect依赖,但你的写法可以优化——应该单独提取addMessage方法,而非获取整个store对象
原因分析
Zustand创建的store中,像addMessage这类方法是稳定的引用,从store创建时就固定下来,不会随着state的更新而改变,这一点和Redux的dispatch完全一致。
但如果你像示例中那样直接通过useNotificationStore()获取整个store对象,这个对象会在state(比如notifications数组)变化时生成新的引用:
- 如果把它加入依赖列表,会导致useEffect在每次state更新时都触发,完全没必要;
- 如果不加入,ESLint会抛出依赖缺失的警告,而且如果后续在useEffect中用到store里的其他state属性,可能会拿到旧的状态值。
正确写法
单独提取需要的方法,这样既保证引用稳定,也符合ESLint的规范:
function Notify() { // 只提取需要的addMessage方法 const addMessage = useNotificationStore(state => state.addMessage); useEffect(() => { // 执行异步操作后调用 addMessage({ /* 你的消息 payload */ }) }, [dependency1, addMessage]) // 这里可以放心加入addMessage,因为它的引用不会变 return <div /> }
补充说明
虽然Zustand的方法引用是稳定的,理论上不加入依赖也不会有问题,但为了避免ESLint警告,同时让代码逻辑更清晰,建议还是把提取出来的方法加入依赖列表——它不会导致useEffect不必要地重复执行。
内容的提问来源于stack exchange,提问作者Sushant
相关产品推荐
相关产品推荐

