乐闻世界logo
搜索文章和话题

如何优化 Zustand 的性能,减少不必要的重渲染?

3月6日 21:41

Zustand 性能优化策略:

  1. 选择订阅(Selective Subscription)

    • 只订阅组件真正需要的状态部分
    • 使用回调函数选择状态,而不是订阅整个状态
    • 示例:
      javascript
      // 好的做法:只订阅需要的状态 const count = useStore((state) => state.count); // 避免:订阅整个状态 const store = useStore(); const count = store.count;
  2. 使用稳定的选择器

    • 避免在组件渲染过程中创建新的选择器函数
    • 使用 useCallback 或 useMemo 缓存选择器
    • 示例:
      javascript
      import { useCallback } from 'react'; function Counter() { const increment = useCallback( () => useStore.getState().increment(), [] ); const count = useStore((state) => state.count); return ( <div> <h1>{count}</h1> <button onClick={increment}>Increment</button> </div> ); }
  3. 批量更新

    • 使用 set 函数的函数式更新,可以批量处理多个状态变更
    • 示例:
      javascript
      const useStore = create((set) => ({ count: 0, user: null, updateData: (newCount, newUser) => set((state) => ({ count: state.count + newCount, user: newUser, })), }));
  4. 使用中间件

    • persist 中间件的合理配置,避免过度持久化
    • 自定义中间件进行性能监控
  5. 状态结构设计

    • 合理组织状态结构,避免深层嵌套
    • 将相关状态放在一起,便于选择订阅
  6. 避免在选择器中执行复杂计算

    • 对于复杂计算,考虑使用 useMemo 或在 store 中预计算
  7. 使用 getState() 和 setState()

    • 对于非 React 环境或不需要触发重渲染的场景
    • 示例:
      javascript
      // 在非 React 代码中使用 const store = useStore.getState(); store.increment();

性能优化检查清单:

  • 使用选择订阅而非全量订阅
  • 缓存选择器函数
  • 批量处理状态更新
  • 合理设计状态结构
  • 避免在选择器中进行复杂计算
  • 按需使用 getState() 和 setState()
标签:Zustand