Skip to content
⚠️ This article was written in 2021. Some content may be outdated.

Valtio Proxy 狀態管理

Valtio Proxy 狀態管理這個話題社區討論了很多次,但隨着版本迭代,很多結論需要更新。本文基於最新版本重新梳理。

入門指南

先來看基本的實現方式:

javascript
import { create } from 'zustand'
import { persist, devtools } from 'zustand/middleware'

const useStore = create(
  devtools(persist(
    (set, get) => ({
      user: null,
      theme: 'light',
      notifications: [],
      setUser: (user) => set({ user }),
      toggleTheme: () => set(s => ({
        theme: s.theme === 'light' ? 'dark' : 'light'
      })),
      unreadCount: () => get().notifications.filter(n => !n.read).length
    }),
    { name: 'app-store' }
  ))
)

這段代碼展示了基本的使用方式。實際項目中還需要考慮錯誤處理和邊界條件。

源碼分析

在這個基礎上,我們可以進一步優化:

javascript
import { create } from 'zustand'
import { persist, devtools } from 'zustand/middleware'

const useStore = create(
  devtools(persist(
    (set, get) => ({
      user: null,
      theme: 'light',
      notifications: [],
      setUser: (user) => set({ user }),
      toggleTheme: () => set(s => ({
        theme: s.theme === 'light' ? 'dark' : 'light'
      })),
      unreadCount: () => get().notifications.filter(n => !n.read).length
    }),
    { name: 'app-store' }
  ))
)

這種模式在大型項目中非常實用,能顯著降低維護成本。

真實場景應用

實際項目中的用法會更復雜一些:

javascript
import { create } from 'zustand'
import { persist, devtools } from 'zustand/middleware'

const useStore = create(
  devtools(persist(
    (set, get) => ({
      user: null,
      theme: 'light',
      notifications: [],
      setUser: (user) => set({ user }),
      toggleTheme: () => set(s => ({
        theme: s.theme === 'light' ? 'dark' : 'light'
      })),
      unreadCount: () => get().notifications.filter(n => !n.read).length
    }),
    { name: 'app-store' }
  ))
)

通過這種方式,代碼的可測試性和可擴展性都得到了提升。

優化技巧

以下是一個完整的示例:

javascript
import { create } from 'zustand'
import { persist, devtools } from 'zustand/middleware'

const useStore = create(
  devtools(persist(
    (set, get) => ({
      user: null,
      theme: 'light',
      notifications: [],
      setUser: (user) => set({ user }),
      toggleTheme: () => set(s => ({
        theme: s.theme === 'light' ? 'dark' : 'light'
      })),
      unreadCount: () => get().notifications.filter(n => !n.read).length
    }),
    { name: 'app-store' }
  ))
)

注意邊界條件處理,這在生產環境中至關重要。

小結

  • 代碼示例僅供參考,需根據業務場景調整
  • Valtio Proxy 狀態管理不是銀彈,需要根據項目規模和技術棧選擇
  • 理解底層原理比記住 API 更重要

MIT Licensed