当我们想要触发更新时, 必须要调用 set | setState 方法. 该方法是基于现有整体状态的浅合并
例如下面这种写法, 最后将得到状态 {salmon, tuna, setSalmon }
1const useStore = create((set) => ({2salmon: 1,3tuna: 2,4setSalmon: (newVal) => set(() => ({ salmon: newVal }))5}))
如果我们要单独针对某一个状态进行更改, 我们可以从 state 中获取当前值, 然后进行新值的运算并返回合并
1export const useStore = create()((set) => ({2count1: 1,3count2: 1,4inc_count1: () => set((state) => ({ count1: state.count1 + 1 })),5dec_count1: () => set((state) => ({ count1: state.count1 - 1 })),6inc_count2: () => set((state) => ({ count2: state.count2 + 1 })),7dec_count2: () => set((state) => ({ count2: state.count2 - 1 })),8}))
完整如下
01import Count1 from './count1'02import Count2 from './count2'0304export default function Counter() {05return (06<div className='flex items-center justify-center p-4 gap-4'>07<Count1 />08<Count2 />09</div>10)11}
set 方法的本质上是不可变数据的更新。
例如这个案例中
1import { create } from 'zustand'23const useCountStore = create((set) => ({4count: 0,5inc: () => set((state) => ({ count: state.count + 1 })),6}))
set 方法的完整形态是
1set((state) => ({2...state,3count: state.count + 14}))
但是,我们在使用时,会简写
1set((state) => ({ count: state.count + 1 }))
当然,你也可以传入一个布尔值,来禁用简写的合并模式,但是通常我们不会这样做。
1set((state) => ({ count: state.count + 1 }), false)