zustand - 状态管理

Zustand 是一个轻量、快速且灵活的 React 状态管理库

同步修改

//zustand
import { create } from "zustand"

//1.创建store

//①:函数参数必须返回一个对象 对象内部编写状态数据和方法
//②:set是用来修改数据的专门方法必须调用它来修改数据
// 语法1:参数是函数, 需要用到老数据的场景
// 语法2:参数直接是一个对象   set({count : 100})
const useStore = create((set)=>{
  return {
    //状态数据
    count: 0,
    //修改状态数据的方法
    inc:()=>{
      set((state)=>({count:state.count +1}))
    }
  }
})

//2. 绑定store到组件
//useStore => {count , inc}

function  PreZustand(){
  const {count,inc} = useStore()
  return (
    <>
      <button onClick={inc}>{count}</button>
    </>
  )
}

export default PreZustand

异步支持

在函数中编写异步逻辑,最后只需要调用set方法传入新状态即可

//zustand
import { useEffect } from "react"
import { create } from "zustand"
const URL = ''
//1.创建store

const useAsyncStore = create((set)=>{
  return {
    channelList: [],
    fetchGetList:async()=>{
      const res = await fetch(URL)
      const jsonRes = await res.json()
      console.log(jsonRes)
      set({
        channelList: jsonRes.data.channels
      })
    }
  }
})


//2. 绑定store到组件


function  PreZustand(){

  const {fetchGetList,channelList} = useAsyncStore()

  useEffect(()=>{
    fetchGetList()
  },[fetchGetList])
  return (
    <>
      <ul>
        {
          channelList.map(item=><li key={item.id}>{item.name}</li>)
        }
      </ul>
    </>
  )
}

export default PreZustand

切片模式

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

import { useEffect } from "react"
import { create } from "zustand"
const URL = 'http://geek.itheima.net/v1_0/channels'

//1.拆分子模块 再组合起来

//创建counter相关的切片
const createCounterStore = (set)=>{
  return {
    //状态数据
    count: 0,
    //修改
    inc: ()=>{
      set(state => ({count:state.count +1}))
    }
  }
}

//创建channel相关切片
const createChannelStore = (set)=>{
  return {
    channelList: [],
    fetchGetList: async ()=>{
      const res = await fetch(URL)
      const jsonData = await res.json()
      set({channelList: jsonData.data.channels})
    }
  }
}

//组合切片
const useStore = create((...a) => ({
  ...createCounterStore(...a),
  ...createChannelStore(...a)
}))

function PreZustand2(){
  const {count,inc,channelList,fetchGetList} = useStore()
  useEffect(()=>{
    fetchGetList()
  },[fetchGetList])
  return (
    <>
      <button onClick={inc}>{count}</button>
      <ul>
        {channelList.map((item)=>(<li key={item.id}>{item.name}</li>))}
      </ul>
    </>
  )

}

export default PreZustand2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值