react 中的Zustand的store使用

这个react 中的store 就跟vue中的pinia 是差不多的使用方法

  • create<ThemeState>:创建一个 Zustand store,并用 TypeScript 接口约束 store 的形状。

  • (set) => ({ ... }) :回调函数,set 用于更新状态。

  • 返回值 :对象包含状态 (theme)和修改状态的方法 (setTheme、toggleTheme)。

    • setTheme:直接设置新主题。set({ theme }) 会合并新状态。

    • toggleTheme:基于当前状态切换。set((state) => ({ theme: ... })) 使用函数式更新。

      import { create } from 'zustand';

      type Theme = 'light' | 'dark';

      interface ThemeState {
      theme: Theme;
      setTheme: (theme: Theme) => void;
      toggleTheme: () => void;
      }

      export const useThemeStore = create((set) => ({
      theme: 'light',
      setTheme: (theme) => set({ theme }),
      toggleTheme: () => set((state) => ({ theme: state.theme === 'light' ? 'dark' : 'light' })),
      }));

store 文件放在 src/store/useThemeStore.ts

组件中使用:

复制代码
// src/pages/Home.tsx
import { useThemeStore } from '../store/useThemeStore';

function Home() {
  // 解构出 state 和 actions
  const { theme, setTheme, toggleTheme } = useThemeStore();

  return (
    <div style={{ background: theme === 'dark' ? '#333' : '#fff' }}>
      <p>Current theme: {theme}</p>
      <button onClick={() => setTheme('light')}>Light</button>
      <button onClick={() => setTheme('dark')}>Dark</button>
      <button onClick={toggleTheme}>Toggle</button>
    </div>
  );
}

export default Home;

也可以这样写 优化

复制代码
function ShowTheme() {
  const theme = useThemeStore((state) => state.theme);
  return <div>Theme: {theme}</div>;
}

function ThemeControls() {
  const setTheme = useThemeStore((state) => state.setTheme);
  const toggleTheme = useThemeStore((state) => state.toggleTheme);
  return (
    <>
      <button onClick={() => setTheme('light')}>Light</button>
      <button onClick={toggleTheme}>Toggle</button>
    </>
  );
}

因为 Zustand 的 store 是在 React 外部创建的全局单例,通过 create 返回的 hook 会订阅这个单例的变化,所以不需要 Context。

这个就跟vue 的一模一样的 当然这个是不分模块的写法

我们如果项目庞大 需要分模块 就需要跟vue开发一样了需要分模块

相关推荐
lovingsoft1 分钟前
Chrome Lighthouse 详解
前端·chrome
Qlly12 分钟前
全栈工程师怎么接需求?从一句「加个功能」聊到能开发、能验收
前端·后端
马可家的菠萝16 分钟前
你的微信“文件传输助手”,是不是已经成了第二个网盘?
前端·后端·架构
略略略啦16 分钟前
Vibe Coding 基于Spec DD和TDD的实践指南
前端
shmily麻瓜小菜鸡37 分钟前
前端实现图片与PDF文字识别敏感信息打码方案
前端·pdf·状态模式
打工仔折腾 AI43 分钟前
LangChain 工具调用实战:从 Tool 定义到 Agent 执行链路拆解
java·前端·人工智能·后端·python·langchain·ai agent 实战
汉堡大王95271 小时前
单次输出拉到100万Token:拆完 Gemini 4 Argon 的续写协议,才看懂谷歌这7个月在憋什么
前端·人工智能·后端
看浪的路人1 小时前
第9讲:大模型应用监控与可观测性——OpenTelemetry + Prometheus + Grafana 全链路追踪
java·前端·spring
内存过载1 小时前
用表格模拟甘特图:项目排期的土办法
前端·低代码
葡萄城技术团队1 小时前
用 SpreadJS 数据验证实现省市区三级联动
前端