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开发一样了需要分模块

相关推荐
Dream-Y.ocean2 小时前
鸿蒙PC平台宅匠 3D 室内设计适配实战:基于 Electron 壳方案的 Three.js 双渲染引擎与参数化户型编辑器开发
javascript·3d·harmonyos
Csvn3 小时前
性能监控
前端
Highcharts.js3 小时前
Highcharts Gantt使用符号的自定义数据标签开发甘特图示例
javascript·甘特图·highcharts·图表开发·实战代码·响应式图表
Csvn3 小时前
构建工具
前端
FRing034 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
JavaPub-rodert5 小时前
从零搭建通用管理后台:ShiyuAdmin 的 Go、React 与 RBAC 实践
开发语言·react.js·golang
kyriewen6 小时前
Skills 榜前 10 我全装了:只有 3 个能直接用
前端·javascript·程序员
IT_陈寒6 小时前
当Java的hashCode遇上Lombok,我的缓存被全清了
前端·人工智能·后端
工控丫丫7 小时前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库
jerrywus7 小时前
我用 GPT-6.1-sol 做了台会讲解的 3D 售货机:60 罐饮料,一口没喝上
前端·agent·claude