react状态管理方案

zustand

优势:

  • 极简的 api,较低的学习成本。只需通过 create 函数创建 store,直接定义状态和修改状态的方法,无需冗余模板。
  • 更灵活的状态访问方式。支持选择性订阅(只监听需要的状态字段,减少不必要的重渲染)。const count = useStore((state) => state.count)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// src/stores/useCounter.ts

// 引入 zustand 库
import {create} from 'zustand'

type CounterState = {
count: number,
add: () => void
minus: () => void
}

// 创建一个 zustand 状态管理 store
const useCounter = create<CounterState>((set) => (
{
count: 0,
add: () => set((state: any) => ({count: state.count + 1})),
minus: () => set((state: any) => ({
count: state.count - 1
}))

}
))

export default useCounter

在页面上使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import useCounter from '@/stores/useCounter'

function App() {
const {count, add, minus} = useCounter()
return (
<>
<div>
{count}
</div>
<button onClick={add}>
add
</button>
<button onClick={minus}>
minus
</button>
</>
)
}

jotai

1
2
3
4
// AgeAtom.ts
import {atom} from 'jotai'

export const ageAtom = atom(0)
1
2
3
4
// NameAtom.ts
import {atom} from 'jotai'
export const nameAtom = atom('')

1
2
3
4
5
6
7
// InfoAtom.ts
import {atom} from 'jotai'
import {ageAtom, nameAtom} from './Atom'
export const infoAtom = atom((get) => ({
age: get(ageAtom),
name: get(nameAtom)
}))

在页面上使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import {useAtomValue, useSetAtom} from 'jotai'
import {infoAtom, ageAtom, nameAtom} from './Atom'
function App() {
const info = useAtomValue(infoAtom)
const setAge = useSetAtom(ageAtom)
const setName = useSetAtom(nameAtom)
return (
<>
<div>
{info.age}
</div>
<div>
{info.name}
</div>
<button onClick={() => setAge((age) => age + 1)}>+</button>
<button onClick={() => setName((name) => name + 'hualu')}>add name</button>
</>
)
}

redux


react状态管理方案
https://zouhualu.github.io/20240915/react状态管理方案/
作者
花鹿
发布于
2024年9月15日
许可协议