React:状态管理zustand

参考文档

zustand

zustand的优势

相对其他状态管理工具,zustand具有以下优势:

  1. 较少样板代码
  2. Zustand仅在 state 发生更改时渲染组件。状态的更改通常可以在不必重新渲染组件的情况下进行处理。
  3. 状态管理是集中的,并通过简单定义的操作进行更新。在这方面,它与Redux类似,但与Redux不同,在Redux中,开发人员必须创建reduceractionsdispatch 来处理状态,Zustand使其变得更容易。
  4. 使用 Hooks 来消耗状态。Hooks 在React中很流行,因此也是一种受欢迎的状态管理方法。
  5. Zustand利用了易于使用和易于实现的代码。
  6. 通过消除使用 Context Provides 来提供干净的代码,从而产生更短、更可读的代码。

一、使用

1. 安装依赖
npm i zustand
2. 创建Store

zustand 提供了create 方法以创建store对象。该store对象包含了我们项目中要用到的所有状态,以及操作这些状态的函数方法:

// src/zustandStore/countStore.js
import {create} from 'zustand';

const countStore = create(set => ({
	count: 0, // 状态值
	// 增加函数,通过传入的 state 获取当前state中的值,实现递增
	increment: () => set(state => ({count: state.count + 1})),
	// 减少函数,通过传入的 state 获取当前state中的值,实现递增
	decrement: () => set(state => ({count: state.count - 1})),
}))

export default countStore;

如上,create 函数中有个 set()方法,通过该方法,我们可以定义状态变更方法;

set() 中的state 形参可以让我们拿到当前状态值,并在该值的基础上进行操作(递增/递减等等);

3. 访问存储状态

创建 src/App.zustand.jsx 文件,在其中我们引入刚刚创建的 countStore函数;

调用该函数,并解构出我们需要的 count变量、incrementdecrement两个操作方法:

import countStore from './zustandStore/countStore';

function App() {
	// 导出count及两个操作方法
	const {count, increment, decrement} = countStore();

	return (
		<div>
			<button onClick={increment}>count ++</button>
			{count}
			<button onClick={decrement}>count --</button>
		</div>
	)
}

export default App;

src/index.js中引入 App:

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App.zustand';

const root = ReactDOM.createRoot(document.getElementById('root'));

root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);
4. 效果

在这里插入图片描述

三、异步获取数据

zustand中对于异步的支持不需要特殊的操作,直接在函数中编写异步逻辑,最后只需要调用set方法传入新状态即可。

1. 编码

我们新建一个 src/zustandStore/channelStore.js 文件:

import { create } from 'zustand';
// 我这里使用axios 获取数据
import axios from 'axios';

const channelStore = create(set => ({
	// 状态数据
	channelList: [],
	// 异步方法
	fetchChannelList: async () => {
		const res = await axios.get('http://geek.itheima.net/v1_0/channels');
		
		set({
			channelList: res.data.data.channels;
		})
	}
}))

export default channelStore;

src/App.zustand.jsx 文件 导入channelStore:

...
import {useEffect} from 'react';
import channelStore from './zustandStore/channelStore';
...

function App() {
	const {channelList, fetchChannelList} = channelStore();

	// useEffect 中调用异步操作
	useEffect(() => {
		fetchChannelList();
	}, [fetchChannelList])
	
	return (
		...
		<ul>
			{channelList.map(item => <li key={item.id}>{item.name}</li>)}
		</ul>
		...
	)
}
2. 效果

在这里插入图片描述

四、切片组合

当我们项目较复杂,store较大时 可以使用 切片模式 将模块进行切分组合,类似于模块化:
在这里插入图片描述
经过上述操作,我们的 zustandStore 目录下应该有 channelStore.jscountStore.js 两个文件:
在这里插入图片描述
我们新建一个 zustandStore/index.js:

import {create} from 'zustand';
import channelStore from './channelStore';
import countStore from './countStore';

// 组合组件
const zustandStore = create((...args) => {
    return {
        ...channelStore(...args),
        ...countStore(...args)
    }
})

export default zustandStore;

src/App.zustand.jsx 中做下调整:

// 切片模式
import zustandStore from './zustandStore';
...

// 切片模式
const {count, increment, decrement, channelList, fetchChannelList} = zustandStore();
...
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端卡卡西呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值