当前位置: 首页 > news >正文

从0死磕全栈第五天:React 使用zustand实现To-Do List项目

代码世界是现实的镜像,状态管理教会我们:真正的控制不在于凝固不变,而在于优雅地引导变化。

这是「从0死磕全栈」系列的第5篇文章,前面我们已经完成了环境搭建、路由配置和基础功能开发。今天,我们将引入一个轻量级但强大的状态管理工具 —— Zustand,来实现一个完整的 TodoList 应用。


Zustand 简介

Zustand 是一个轻量级、灵活的 React 状态管理库,以极简 API 解决复杂状态共享问题。

  • ✅ 无需 Provider 包裹,直接导入使用
  • ✅ 使用 create 创建 store,通过 useStore 随时随地访问状态
  • ✅ 支持中间件(如持久化、日志)、异步逻辑
  • ✅ 代码简洁易维护,是中小型项目的理想选择

下面我们将用 React + TypeScript + Zustand 实现一个功能完整的 TodoList。


要实现的功能

  1. 添加待办事项

    • 在输入框中输入内容,点击“添加”按钮或按 Enter 键
    • 新事项添加到列表底部
  2. 标记完成/未完成

    • 点击复选框切换完成状态
    • 已完成事项显示删除线样式
  3. 删除事项

    • 点击右侧“删除”按钮移除该事项
  4. 统计信息

    • 显示总事项数和已完成事项数

1. 安装依赖

npm install zustand

2. 创建 Zustand Store

// store/todoStore.ts
import { create } from 'zustand';// 定义 Todo 项的类型
interface Todo {id: number;text: string;completed: boolean;
}// 定义 Store 的类型
interface TodoStore {todos: Todo[];addTodo: (text: string) => void;toggleTodo: (id: number) => void;deleteTodo: (id: number) => void;
}// 创建 Zustand Store
const useTodoStore = create<TodoStore>((set) => ({// 初始状态:空数组todos: [<

文章转载自:

http://sRmFH9Sb.xkyfq.cn
http://L1PKApPf.xkyfq.cn
http://QL5t8sK9.xkyfq.cn
http://2zNE0eXC.xkyfq.cn
http://PoBdQnWc.xkyfq.cn
http://y831tYRv.xkyfq.cn
http://TusI8CPP.xkyfq.cn
http://Y39gm390.xkyfq.cn
http://v9ncjkHv.xkyfq.cn
http://C9dzY8rZ.xkyfq.cn
http://AEzKwXJx.xkyfq.cn
http://pQV5B45x.xkyfq.cn
http://Ta752Zmo.xkyfq.cn
http://CECHfZ6G.xkyfq.cn
http://04pEC3xP.xkyfq.cn
http://T6puWQW3.xkyfq.cn
http://rrTQE0rI.xkyfq.cn
http://ZUOuvM9j.xkyfq.cn
http://tpoJbVdc.xkyfq.cn
http://lYaMzNoe.xkyfq.cn
http://E2Fp5G6E.xkyfq.cn
http://Npjshgvf.xkyfq.cn
http://gKe4d39f.xkyfq.cn
http://7uFk6Rvh.xkyfq.cn
http://jxqi62fU.xkyfq.cn
http://XLt1FlvO.xkyfq.cn
http://2od4tNUE.xkyfq.cn
http://vCYcfll7.xkyfq.cn
http://NFThO31J.xkyfq.cn
http://kWIMzYqQ.xkyfq.cn
http://www.dtcms.com/a/369938.html

相关文章:

  • 从0死磕全栈第3天:React useState 实战,用 TS 手搓一个注册表单
  • MacOS 使用 luarocks+wrk+luajit
  • Rust在医疗系统中的应用:安全、性能与合规性实践(上)
  • 《云原生微服务治理进阶:隐性风险根除与全链路能力构建》
  • 006-Dephi 表达式 选择语句 循环语句其他语句
  • 深度学习:残差网络ResNet与迁移学习
  • SQL 实战指南:校园图书管理系统 SQL 设计(借阅 / 归还 / 库存查询实现)——超全项目实战练习
  • 输入2.2V~16V 最高输出20V2.5A DCDC升压芯片MT3608L
  • 人工智能学习:什么是seq2seq模型
  • 【基础-单选】singleton模式下首次进入的执行顺序是
  • 基于YOLO8的汽车碰撞事故检测系统【数据集+源码+文章】
  • 【c++进阶系列】:万字详解AVL树(附源码实现)
  • 【设计模式】 工厂方法模式
  • 总结-遇到
  • java分布式场景怎么实现一个高效的 读-写锁
  • 计算机毕设大数据方向:基于Spark+Hadoop的餐饮外卖平台数据分析系统【源码+文档+调试】
  • Java并发机制的底层实现原理
  • 数据结构:查找
  • PyQt5 多线程编程与排错技术文档
  • Linux 使用pip报错(error: externally-managed-environment )解决方案
  • Flask论坛与个人中心页面开发教程完整详细版
  • 【PostgreSQL】如何实现主从复制?
  • 进程与服务管理:systemd / sysvinit 服务管理、定时服务(cron / at)
  • Java全栈工程师面试实录:从基础到高并发场景的技术探索
  • 2025高教社国赛数学建模A题参考论文35页(含代码和模型)
  • 前缀和、子矩阵的和;差分、差分矩阵
  • 如何在 FastAPI 中巧妙覆盖依赖注入并拦截第三方服务调用?
  • LeetCode算法日记 - Day 34: 二进制求和、字符串相乘
  • 【PyTorch实战:Tensor】4、NumPy与PyTorch Tensor指南:深度学习中的数据操作与转换
  • W25Q128