react中zuStand状态管理工具使用

一、zuStand的基本使用

1.安装工具

npm install zustand

2.新建文件

在src下新建store文件夹,在store文件夹下新建zuStand.js文件

3.配置zuStand.js

// 1.引入创建方法
import { create } from "zustand";

// 2.创建store
const useStore = create((setState)=>{
    return {
        // 状态数据
        count:0,
        // 修改状态数据的方法
        incrementCount:()=>{
            setState((state)=>({count:state.count+1}))
        },
        updateCount:()=>{
            setState({count:100})
        }
    }
})
// 3.暴露store实例
export default useStore

4.组件中引入使用

// 1.引入store实例
import  useStore  from "@/store/zustand"

function Zustand(){
    // 2.解构出需要的状态变量和方法
    const {count,incrementCount,updateCount} = useStore()
    return (
        <div>
            我是Zustand页面{count}
            <button onClick={incrementCount}>+</button>
            <button onClick={updateCount}>更新</button>
        </div>
    )
}

export default Zustand

5.最终效果

二、zuStand的异步请求的使用

1.zustand.js文件中

// 1.引入创建方法
import { create } from "zustand";

// 2.创建store
const useStore = create((setState) => {
    return {
        // 状态数据
        count: 0,
        dataList: [],
        // 修改状态数据的方法
        incrementCount: () => {
            setState((state) => ({ count: state.count + 1 }))
        },
        updateCount: () => {
            setState({ count: 100 })
        },
        // 异步请求
        getDataList: async () => {
            const response = await fetch('http://localhost:8888/kanno'); // 通过fetch来请求数据
            const data = await response.json();
            setState({dataList:data})
        }
    }
})
// 3.暴露store实例
export default useStore

说明:其实就是与同步方法一样的写法,就只不过是在同步方法中添加了异步请求

2.组件中使用

// 1.引入store实例
import  useStore  from "@/store/modules/zustand"
import { useEffect } from "react"

function Zustand(){
    // 2.解构出需要的状态变量和方法
    const {count,incrementCount,updateCount,dataList,getDataList} = useStore()
    useEffect(()=>{
        getDataList()
    },[])
    return (
        <div>
            我是Zustand页面{count}
            <button onClick={incrementCount}>+</button>
            <button onClick={updateCount}>更新</button>
            {dataList.map((item,index)=><div key={index}>{item.name}</div>)}
        </div>
    )
}

export default Zustand

3.最终效果

三、片段化状管理状态管理

1.zuStand.js文件中

// 1.引入创建方法
import { create } from "zustand";

// 2.创建多个store实例(片段化)
const createCountStore = create((setState) => {
    return {
        // 状态数据
        count: 0,
        // 修改状态数据的方法
        incrementCount: () => {
            setState((state) => ({ count: state.count + 1 }))
        },
        updateCount: () => {
            setState({ count: 100 })
        }
    }
})

const createDataListStore = create((setState)=>{
    return {
         // 状态数据
         dataList: [],
         // 修改状态数据的方法 异步请求
         getDataList: async () => {
             const response = await fetch('http://localhost:8888/kanno'); // 通过fetch来请求数据
             const data = await response.json();
             setState({dataList:data})
         }
    }
})

// 3.组合片段store实例
const useStore = create((...a)=>{
    return {
        ...createCountStore(...a),
        ...createDataListStore(...a)
    }
})


// 4.暴露组合后的store实例
export default useStore

2.组件使用中

无需变化

// 1.引入store实例
import  useStore  from "@/store/modules/zustand"
import { useEffect } from "react"

function Zustand(){
    // 2.解构出需要的状态变量和方法
    const {count,incrementCount,updateCount,dataList,getDataList} = useStore()
    useEffect(()=>{
        getDataList()
    },[])
    return (
        <div>
            我是Zustand页面{count}
            <button onClick={incrementCount}>+</button>
            <button onClick={updateCount}>更新</button>
            {dataList.map((item,index)=><div key={index}>{item.name}</div>)}
        </div>
    )
}

export default Zustand

3.说明

本应该效果和上次的一模一样才对,但是我这里出现了报错,在组合片段store实例的位置提示已经弃用,导致报错了。官网没有说明该问题,写法还是这样的。

整体的思路就是将两个实例再次放在create方法中重新返回实例,相当于把两个实例的状态变量和方法通过展开运算符放在一个对象中再重新创建一个store实例

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值