react状态管理库 - zustand

什么是zustand?

zustand 是一个轻量级、快速且可扩展的 React 状态管理库,旨在提供一种简单直接的方式来管理应用状态,而无需其他解决方案通常伴随的繁琐代码。根据官方 Zustand 文档,Zustand 是"一个使用简化 flux 原理的小型、快速且可扩展的精简状态管理解决方案"。它允许开发者创建包含状态和操作的 store,这些 store 可以通过 React hooks 进行访问和更新。

中文官网

Zustand 中文网

安装

javascript 复制代码
npm install zustand

基础使用

创建store
javascript 复制代码
import { create } from 'zustand'

const useStore = create((set) => ({  //set是用来修改数据的专门方法,必须调用它来修改数据
  //状态数据  
  bears: 0,
  //修改方法
  increasePopulation: () => set((state) => ({ bears: state.bears + 1 })), //加一
  removeAllBears: () => set({ bears: 0 }),//置0
  updateBears: (newBears) => set({ bears: newBears }),//接收传递的值并赋值
}))
export default useStore
绑定组件并使用
javascript 复制代码
import useStore from '../../zustand'
const Month = () => {
   const bears = useStore((state) => state.bears)
   const { increasePopulation, removeAllBears, updateBears } = useStore()

  return (
    <div> 
      {bears}
      <button onClick={increasePopulation}>加一</button>
      <button onClick={removeAllBears}>置0</button>
      <button onClick={()=>updateBears(3)}>传值</button>
    </div>
  )
};
export default Month;

异步使用

异步实现接口请求更改数据
javascript 复制代码
import axios from 'axios'
import { create } from 'zustand'

const useStore = create((set) => ({
  listData:[],
  changeList:async()=>{
   let res =await axios.get('https://api.taolale.com/api/xjj/get?key=KadadfdgfdhhjGEK')
   set({listData:res.data.data})
  }
  
}))
export default useStore
组件调用
javascript 复制代码
import useStore from '../../zustand'
const Month = () => {
   const list = useStore((state) => state.listData)
   const { changeList} = useStore()

  return (
    <div> 
      {list}
      <button onClick={changeList}>获取数据</button>
    </div>
  )
};
export default Month;

切片模式(模块化)

拆分模块,在组合起来

场景:当单个store比较大的时候,可以采用切片模式进行模块拆分组合,类似于模块化

模块一 createBearSlice.js
javascript 复制代码
const createBearSlice = (set) => ({
  bears: 0,
  addBear: () => set((state) => ({ bears: state.bears + 1 })),
  eatFish: () => set((state) => ({ fishes: state.fishes - 1 })),
})
export default createBearSlice
模块二 createFishSlice.js
javascript 复制代码
const createFishSlice = (set) => ({
  fishes: 0,
  addFish: () => set((state) => ({ fishes: state.fishes + 1 })),
})
export default createFishSlice
组合模块 index.js
javascript 复制代码
import { create } from 'zustand'
import  createBearSlice from './createBearSlice'
import  createFishSlice from './createFishSlice'

const useBoundStore = create((...a) => ({
  ...createBearSlice(...a),
  ...createFishSlice(...a),
}))
export {useBoundStore}
组件使用 直接解构使用
javascript 复制代码
import { useBoundStore } from './store/index'
const Month = () => {
   const { bears,fishes,addBear} = useBoundStore()

  return (
    <div> 
      {fishes}
      {bears}
      <button onClick={addBear}>加一</button>
    </div>
  )
};
export default Month;
相关推荐
阿华的代码王国11 分钟前
【Android】RecyclerView实现新闻列表布局(1)适配器使用相关问题
android·xml·java·前端·后端
汪子熙34 分钟前
Angular 最新的 Signals 特性详解
前端·javascript
Spider_Man35 分钟前
前端路由双雄传:Hash vs. History
前端·javascript·html
南方kenny38 分钟前
CSS Grid 布局:从入门到精通,打造完美二维布局
前端·javascript·css
小泡芙丫38 分钟前
从买房到代码:发布订阅模式的"房产中介"之旅
前端·javascript
企鹅吧40 分钟前
前端导出 pdf 与 跑马灯效果 最佳实践
前端·javascript·vue.js
南方kenny40 分钟前
移动端适配的利器:lib-flexible 原理与实战
前端·javascript·react.js
沫小北42 分钟前
HarmonyOS 自定义日期选择器组件详解
前端
大土豆的bug记录1 小时前
鸿蒙拉起系统定位和app授权定位
前端·javascript·harmonyos
用户47949283569152 小时前
mcp是怎么和大模型进行交互的,有哪些交互方式
前端·人工智能