Zustand 让 React 状态变得太简单

ops/2024/11/22 21:41:57/

为什么选择 Zustand?

Zustand 是一个为 React 打造的现代化状态管理库,它以其简洁的 API 和强大的功能正在改变前端开发的方式。相比 Redux 繁琐的样板代码(action types、dispatch、Provider等),Zustand 提供了更加优雅且直观的解决方案。

核心特性

1. 基于 Hook 的简洁API

import { create } from 'zustand'// 创建 store
const useStore = create((set) => ({count: 0,increment: () => set((state) => ({ count: state.count + 1 })),
}))// 在组件中使用
function Counter() {const count = useStore((state) => state.count)const increment = useStore((state) => state.increment)return <button onClick={increment}>{count}</button>
}

2. 灵活的状态订阅

Zustand 允许组件只订阅它们需要的状态片段,从而优化性能:

// 只订阅特定字段
const userName = useStore(state => state.user.name)
const userAge = useStore(state => state.user.age)

3. 去中心化的状态管理

不同于 Redux 的单一状态树理念,Zustand 支持创建多个独立的 store,更符合组件化开发的思想:

const useUserStore = create((set) => ({user: null,setUser: (user) => set({ user })
}))const useCartStore = create((set) => ({items: [],addItem: (item) => set((state) => ({items: [...state.items, item]}))
}))

4. 派生状态与浅比较

通过 useShallow() 可以轻松创建派生状态:

import { useShallow } from 'zustand/shallow'// 当任意原始状态变化时更新
const { name, age } = useStore(useShallow(state => ({ name: state.user.name, age: state.user.age }))
)

5. 异步操作支持

内置支持异步 action,无需额外的中间件:

const useStore = create((set, get) => ({users: [],fetchUsers: async () => {const response = await fetch('/api/users')const users = await response.json()set({ users })}
}))

6. 状态更新控制

支持细粒度的状态更新控制:

// 部分更新(默认行为)
set({ user: { ...get().user, name: 'John' } })// 完全替换
set({ user: { name: 'John' } }, true)

7. 直接访问状态

除了 hooks,还支持直接订阅状态变化:

const store = create(...)
const unsubscribe = store.subscribe(state => {console.log('State changed:', state)
})

实战示例

下面是一个购物车功能的完整示例:

const useCartStore = create((set, get) => ({items: [],total: 0,addItem: (item) => set((state) => {const newItems = [...state.items, item]return {items: newItems,total: newItems.reduce((sum, item) => sum + item.price, 0)}}),removeItem: (id) => set((state) => {const newItems = state.items.filter(item => item.id !== id)return {items: newItems,total: newItems.reduce((sum, item) => sum + item.price, 0)}}),clearCart: () => set({ items: [], total: 0 })
}))

总结

Zustand 凭借其简洁的 API、灵活的状态管理方式以及出色的性能,正在成为 React 应用状态管理的首选方案。它既保留了 Redux 的核心优势(不可变性、状态与UI解耦等),又极大地简化了开发流程。如果正在寻找一个现代化的状态管理方案,Zustand 绝对值得一试。

注:这篇文章在保持原文核心内容的基础上,加入了更多代码示例和实际应用场景,使内容更加充实和实用。通过分类组织和详细的示例说明,使读者能更好地理解和应用 Zustand。

最后:

React Hook 深入浅出

CSS技巧与案例详解

vue2与vue3技巧合集

VueUse源码解读


http://www.ppmy.cn/ops/135890.html

相关文章

MySQL最后练习,转转好物交易平台项目

第一步&#xff0c;做一个项目要先做数据库&#xff0c;创建表 这边已经帮你们创好了&#xff0c; CREATE TABLE UserInformation_普通用户信息表 ( id INT(4) NOT NULL COMMENT 编号 AUTO_INCREMENT, username VARCHAR(10) NOT NULL COMMENT 用户名, password VARCHAR(20) N…

HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)习惯推荐方案概述

一、习惯推荐是HarmonyOS学习用户的行为习惯后做出的主动预测推荐。 1.开发者将用户在应用/元服务内的使用行为向HarmonyOS共享&#xff0c;使得HarmonyOS可以基于共享的数据学习用户的行为习惯。 2.在HarmonyOS学习到用户的行为习惯后&#xff0c;会给用户推荐相应功能&#x…

前端:HTML (学习笔记)【1】

一&#xff0c;网络编程的三大基石 1&#xff0c;URL &#xff08;1&#xff09;url —— 统一资源定位符&#xff1a; 网址——整个互联网中可以唯一且准确的确定一个资源的位置。 【项目外】 网址——https://www.baidu.com/ …

实现简易计算器 网格布局 QT环境 纯代码C++实现

问题&#xff1a;通过代码完成一个10以内加减法计算器。不需要自适应&#xff0c;界面固定360*350。 ""按钮90*140&#xff0c;其它按钮90*70。 参考样式 #define DEFULT_BUTTON_STYLE "\ QPushButton{\color:#000000;\border:1px solid #AAAAAA;\border-radi…

大数据治理的核心要素

大数据治理的要素是指为实现对数据的高效管理和利用所需的核心组成部分。这些要素相互关联,共同构建了完整的大数据治理体系。以下是主要的要素: 1. 数据质量管理 数据质量管理确保数据在全生命周期中保持高质量,能被有效使用和信任。 目标 提升数据的准确性、完整性、一致…

Vue项目搭建-2-组合式API

入口-setup 在组件渲染时会优先执行 setup 中代码&#xff0c;执行时机为 beforeCreate 之前 setup 方法中的对象若想要在 template 中使用&#xff0c;需要将方法 return 出去: <script> export default {setup() {console.log(setup had run)const msg "hello…

RK3568 android11 适配敦泰触摸屏 FocalTech-ft5526

一&#xff0c;FocalTech触摸屏简介 FocalTech 的触控控制器常用于各种触摸屏&#xff0c;包括电容式和电阻式屏幕。支持多点触控&#xff0c;能够识别多个手指的输入。 本文提到的 ft5526 支持多达 10 个触控点&#xff0c;能够同时识别多个手指的输入&#xff0c;适合需要复…

SWPUCTF 2024 奇迹新生塞 签到?

很久没有做CTF逆向&#xff0c;找了一道题试一试 还是常规操作看看&#xff0c;多少位的&#xff0c;有没有带壳 再看看是不是EXE程序 先运行看看有什么特别的 尝试输入了一下&#xff0c;直接退出了 IDA打开进行分析 找到主函数 一步一步调试看看&#xff0c;找到运行输出的…