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;
相关推荐
北城以北888839 分钟前
Vue--Vue基础(二)
前端·javascript·vue.js
ObjectX前端实验室1 小时前
【react18原理探究实践】更新调度的完整流程
前端·react.js
tanxiaomi2 小时前
通过HTML演示JVM的垃圾回收-新生代与老年代
前端·jvm·html
palpitation972 小时前
Android App Links 配置
前端
FuckPatience2 小时前
Vue 组件定义模板,集合v-for生成界面
前端·javascript·vue.js
sophie旭2 小时前
一道面试题,开始性能优化之旅(3)-- DNS查询+TCP(三)
前端·面试·性能优化
开心不就得了3 小时前
构建工具webpack
前端·webpack·rust
gerrgwg3 小时前
Flutter中实现Hero Page Route效果
前端
不枯石3 小时前
Matlab通过GUI实现点云的ICP配准
linux·前端·图像处理·计算机视觉·matlab
hhzz3 小时前
Pythoner 的Flask项目实践-在web页面实现矢量数据转换工具集功能(附源码)
前端·python·flask