react 中的Zustand的store使用

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

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

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

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

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

相关推荐
ℋᙚᵐⁱᒻᵉ鲸落4 小时前
移动端滑动手势冲突:overflow: auto导致外层横向滑动失效
前端·javascript·css·vue.js·html
默_笙5 小时前
🎃 前端学了 Next.js,后端该学啥?NestJS 就是 Node 版的蜜雪冰城
前端·javascript
前端snow6 小时前
ai agent --- 实现 openclaw 定时间效果
前端
码云之上6 小时前
换模型之后,Chatbot 为什么要自己做 compact?
前端·agent·前端工程化
এ慕ོ冬℘゜6 小时前
navigator 导航对象 BOM制作方法
javascript
星栈7 小时前
自定义 UI-UX-Pro-Max 的 CSV 知识库,把 AI 生成的后台拉回行业该有的样子
前端·agent·weui
研☆香7 小时前
简单的图片上传 删除 预览
前端
ITresearchGuest7 小时前
我用 AI 一小时写了一个世界杯数据可视化平台|前端 VibeCoding 初体验
前端·人工智能·信息可视化
慧一居士8 小时前
Vite项目中使用Less步骤,详细使用示例
前端·css
花间相见8 小时前
【LangChain组件03】—— LangChain Agents 执行与状态:工作流程与状态管理实战
java·前端·langchain