前言

先抛出一个问题:为什么zustand是react状态管理的最佳实践?

React中的「状态」是什么?

「状态」在react中是指被「标记」的数据。状态分为两种,一种是组件内部的状态state和跨组件状态props。当状态发生变化时react会自动触发更新,也就是根据数据变化后的最新值来实现响应式更新。要注意的是,并不是react中所有的数据叫做状态,只有被useStateuseContexthook(针对函数式组件中)声明定义的值才叫做状态。

状态管理是什么

所谓状态管理就是在react对数据的各种操作,包括数据定义,数据获取,数据更新,数据存储,数据维护等以及数据流向(指会贯穿整个项目的数据,如 Theme)。

回答:为什么zustand是react状态管理的最佳实践

最后说说为什么zustand是react状态管理的最佳实践?

  1. zustand通过hook定义状态的使用方式成为与react无缝契合的天然优势。(数据声明)

  2. zuatsnd通过各种插拔式中间件来拓展自己的功能,无论是异步处理还是持久化,或者是不可变更新。(都对应上了状态管理中的状态处理,数据存储,数据更新操作。)

  3. 无需Provider也能做到组件共享状态,并且是任何组件地方都能使用!(记得遵循hook规则),简直是完美契合react单向数据流状态管理,仿佛就是为了react状态管理而生!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import create from 'zustand'
import { persist } from 'zustand/middleware'
import { immer } from 'zustand/middleware/immer'

// 创建store
const useStore = create(
persist(
immer((set) => ({
user: null,
todos: [],
isLoading: false,

// 异步操作
fetchUser: async (id) => {
set({ isLoading: true })
const response = await fetch(`/api/user/${id}`)
const user = await response.json()
set({ user, isLoading: false })
},

// 不可变更新
addTodo: (todo) => set((state) => {
state.todos.push(todo)
}),

// 复杂状态更新
completeTodo: (id) => set((state) => {
const todo = state.todos.find(t => t.id === id)
if (todo) todo.completed = true
})
})),
{
name: 'app-storage',
getStorage: () => localStorage,
}
)
)

// 在组件中使用
function App() {
const { user, todos, fetchUser, addTodo } = useStore()

return (
// 组件JSX
)
}

总的来说,Zustand成功地在简单性和功能性之间找到了平衡。它提供了强大的状态管理能力,同时保持了使用的简便性和灵活性。这些特性使得Zustand成为React生态系统中一个非常有吸引力的状态管理解决方案。