zustand

zustand教程

  • 定义store
import {create} from 'zustand'

export const useUserStore = create((set, get) => ({
    zsAge: 18,
    lsAge: 18,
    updateAgeZs: (newAge) => set(state => ({zsAge: newAge})),
    updateAgeLs: (newAge) => set(state => ({lsAge: newAge})),
    nameAndAge: () => get().zsInfo.name + get().zsAge,
}))

直接使用useUserStore()会存在别的组件更新了当前组件没使用到的状态,也会造成当前组件重新渲染

const LiSi = () => {
    const {lsAge,updateAgeLs} = useUserStore()

    return <div>
        <p>我是子组件</p>
        {Math.random()*100}
        <p>我的年龄{lsAge}</p>
        <button onClick={() => updateAgeLs(14)}>更新李四年龄</button>
    </div>
}
  • 精准更新

const zsAge = useUserStore(state => state.zsAge)

const ZhangSan = () => {
    const zsAge = useUserStore(state => state.zsAge)
    const updateAgeZs = useUserStore(state => state.updateAgeZs)

    return <div>
        <p>我是子组件</p>
        {Math.random()*100}
        <p>我的年龄{zsAge}</p>
        <button onClick={() => updateAgeZs(12)}>更新张三年龄</button>
    </div>
}

选择多个状态时,当其他组件更新了store的状态,当前组件也会重新渲染,可传递shallow进行优化

	import {shallow} from "zustand/shallow";
	
    const {zsAge, updateAgeZs} = useUserStore(state => ({
        zsAge: state.zsAge,
        updateAgeZs: state.updateAgeZs,
    }),shallow)
import {create} from 'zustand'
import {createJSONStorage, persist} from 'zustand/middleware'

export const useUserStore = create(persist((set) => ({
    zsAge: 18,
    lsAge: 18,
    zsInfo: {
        name: '张三'
    },
    lsInfo: {
        name: '李四'
    },
    updateAgeZs: (newAge) => set(state => ({zsAge: newAge})),
    updateAgeLs: (newAge) => set(state => ({lsAge: newAge})),
}), {name: 'userStore', storage: createJSONStorage(() => localStorage)}))
  • immer使用
import {createJSONStorage, persist} from 'zustand/middleware'
import {immer} from 'zustand/middleware/immer'

export const useUserStore = create(immer(persist((set) => ({
    zsInfo: {
        name: '张三'
    },
    updateName: (newState) => set((state) => {
        state.zsInfo.name = newState
    }),

}), {name: 'userStore', storage: createJSONStorage(() => localStorage)})))
  • 异步
export const useUserStore = create((set) => ({
    getData: async () => {
        const res = await fetch('http://api.xx')
        const data = await res.json()
        return data
    }
}))

在外部更改状态将action抽离出来

 useUserStore.setState(state => ({
      zsAge: state.zsAge + 1
  }))
  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值