10、Vue3中Vuex从入门到实战:手写迷你Vuex,掌握前端状态管理核心

Vue3中Vuex从入门到实战:手写迷你Vuex,掌握前端状态管理核心

在Vue3项目开发中,组件化让代码复用和维护更高效,但跨组件、跨页面的数据共享却成了高频痛点——用户登录信息、全局权限、公共计数器等数据,如果靠组件传参层层传递,代码会变得混乱不堪。这时候,Vuex就成了前端状态管理的“大管家”,帮我们集中式管理共享数据。本文将从前端数据管理的痛点出发,带你吃透Vuex的核心用法,甚至手写一个迷你Vuex理解其底层原理。

一、前端数据管理:为什么需要Vuex?

现代Web应用由组件、数据、路由三大核心构成,组件内部的私有数据用ref/reactive管理即可,但共享数据的管理却需要更规范的方式。

我们先试想一个简单场景:用全局变量存储共享数据。

window._store ={}// 全局存储数据

这种方式看似简单,但存在致命问题:window._store不是响应式的,修改数据后Vue组件无法自动更新视图。如果我们用Vue的响应式API包裹全局数据,并提供统一的修改方法,这就是Vuex的雏形——本质是“响应式的全局数据 + 规范化的修改规则”

二、Vuex是什么?

Vuex是Vue官方的状态管理库,核心作用是集中式存储和管理应用中所有组件的共享状态

可以做一个形象的类比:

  • 小型项目(初创公司):组件私有数据(个人办公用品)随便用,无需规范;
  • 中大型项目(成熟公司):共享数据(公共办公用品)需要“管家”统一管理,申请、修改都有规范——Vuex就是这个“管家”。

核心原则:组件私有数据用ref/reactive管理,跨组件/跨页面共享数据用Vuex管理

三、Vuex快速上手:从安装到组件使用

1. 安装Vuex

Vue3需安装Vuex 4.x版本(@next标识):

npminstall vuex@next 

2. 创建Store实例

src/store/index.js中创建核心的Store,包含state(存储数据)和mutations(同步修改数据的方法):

import{ createStore }from'vuex'const store =createStore({// 定义共享数据state(){return{count:666}},// 定义修改数据的方法(唯一能修改state的地方)mutations:{add(state){ state.count++}}})exportdefault store 

3. 注册Store到Vue应用

在项目入口src/main.js中注册,让所有组件能访问Store:

import{ createApp }from'vue'import App from'./App.vue'import store from'./store'const app =createApp(App) app.use(store)// 注册Vuex app.mount('#app')

4. 组件中使用Vuex

新建src/components/Count.vue,通过useStore获取Store,用计算属性读取state,用commit触发mutation修改数据:

<template> <div @click="add">点击累加:{{ count }}</div> </template> <script setup> import { computed } from 'vue' import { useStore } from 'vuex' // 获取Store实例 const store = useStore() // 读取共享数据(计算属性保证响应式) const count = computed(() => store.state.count) // 触发mutation修改数据(不能直接修改store.state.count) function add() { store.commit('add') } </script> 

四、手写迷你Vuex:理解底层原理

Vuex的核心原理其实很简单:响应式数据 + 依赖注入 + 规范化修改规则。我们用30行代码实现一个迷你版Vuex。

1. 实现核心逻辑(src/store/gvuex.js)

import{ inject, reactive }from'vue'// 依赖注入的唯一标识constSTORE_KEY='__store__'// 供组件获取Store实例的方法exportfunctionuseStore(){returninject(STORE_KEY)}// 创建Store实例的方法exportfunctioncreateStore(options){returnnewStore(options)}classStore{constructor(options){this.$options = options // 用reactive包裹state,让数据响应式this._state =reactive({data: options.state()})// 存储mutation方法this._mutations = options.mutations }// 对外暴露state(只读)getstate(){returnthis._state.data }// 触发mutation的方法commit=(type, payload)=>{const mutation =this._mutations[type] mutation &&mutation(this.state, payload)}// 供app.use(store)调用的安装方法(依赖注入)install(app){ app.provide(STORE_KEY,this)// 全局注入Store}}

2. 替换官方Vuex使用迷你版

修改src/store/index.js,替换为手写的gvuex

// import { createStore } from 'vuex'import{ createStore }from'./gvuex'const store =createStore({state(){return{count:666}},mutations:{add(state){ state.count++}}})exportdefault store 

此时组件中使用useStorecommit的方式和官方Vuex完全一致,核心原理已复刻!

五、Vuex进阶:Getters和Actions

1. Getters:Vuex的“计算属性”

Getters用于对state做派生计算(类似组件的computed),比如实现count的双倍值:

// src/store/index.jsconst store =createStore({state(){return{count:666}},getters:{double(state){return state.count *2}},mutations:{add(state){ state.count++}}})

组件中使用:

const double =computed(()=> store.getters.double)

2. Actions:处理异步修改

Vuex规定mutation只能做同步操作,异步逻辑(如接口请求、延时)需放在actions中,再通过commit触发mutation

// src/store/index.jsconst store =createStore({// ...其他配置actions:{// 异步累加(模拟1秒后修改)asyncAdd({ commit }){setTimeout(()=>{commit('add')},1000)}}})

组件中通过dispatch触发action:

functionasyncAdd(){ store.dispatch('asyncAdd')}

六、Vuex核心设计思想:数据流向

Vuex的核心是“单向数据流”,保证数据修改可追溯:

  1. 组件通过dispatch触发action(异步)或直接commit触发mutation(同步);
  2. mutation是修改state的唯一入口,同步修改state
  3. state更新后,组件通过计算属性读取最新值,视图自动更新。

七、下一代Vuex:Pinia

Vuex对TypeScript的类型推导支持不够友好,因此Vuex作者推出了Pinia(被称为“Vuex5”):

  • 天生支持TypeScript,类型推断更友好;
  • 无需嵌套模块,API更简洁;
  • 完美兼容Vue Devtools;
  • 可作为Vuex的替代方案,学习成本低。

八、总结

  1. 核心原则:私有数据用ref/reactive,共享数据用Vuex;
  2. 核心概念
    • state:存储共享数据;
    • mutation:同步修改state(唯一入口);
    • getters:派生计算state
    • action:处理异步,内部调用mutation
  3. 底层原理:响应式数据(reactive) + 依赖注入(provide/inject) + 规范化修改规则;
  4. 进阶选型:TypeScript项目优先考虑Pinia。

思考题

你的项目中哪些数据适合放在Vuex中管理?比如:

  • 用户登录状态、用户名、权限;
  • 全局主题、布局配置;
  • 购物车数据、全局计数器;
  • 多页面共享的筛选条件、分页信息。

欢迎在评论区交流你的项目实践~


📌 本文配套代码已整理,可结合Vue3项目实操,理解更深刻。如果觉得有帮助,欢迎点赞+收藏~

Read more

手把手教你打造本地私有化AI知识库:Obsidian + OpenCode + Agent Client + MCP Server 完全指南

手把手教你打造本地私有化AI知识库:Obsidian + OpenCode + Agent Client + MCP Server 完全指南 在AI时代,拥有一个高效、私密、可控的个人知识库变得尤为重要。本文将详细介绍如何利用Obsidian + OpenCode + Agent Client + MCP Server这四件套,在本地搭建一个完全私有化的AI知识管理系统。所有数据都存储在你的电脑上,无需联网即可享受AI带来的便捷! 一、整体架构概述 在开始之前,让我们先了解这四个工具的角色: 工具角色作用Obsidian笔记管理本地Markdown笔记管理,支持双向链接MCP Server知识索引将笔记向量化,建立语义搜索能力OpenCodeAI大脑本地AI编程助手,支持多种模型Agent Client对接桥梁让Obsidian能调用AI能力 整个流程是:Obsidian管理笔记 → MCP Server将笔记向量化并提供搜索API → OpenCode作为AI大脑调用MCP服务 → Agent Client将AI能力集成到Obsidian中。 二、环境准备

Flutter 组件 tavily_dart 的适配 鸿蒙Harmony 实战 - 驾驭 AI 搜索引擎集成、实现鸿蒙端互联网知识精密获取与语义增强方案

Flutter 组件 tavily_dart 的适配 鸿蒙Harmony 实战 - 驾驭 AI 搜索引擎集成、实现鸿蒙端互联网知识精密获取与语义增强方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 tavily_dart 的适配 鸿蒙Harmony 实战 - 驾驭 AI 搜索引擎集成、实现鸿蒙端互联网知识精密获取与语义增强方案 前言 在鸿蒙(OpenHarmony)生态的智能个人助理、行业垂直类知识中枢以及需要实时获取互联网最新动态并进行 AI 语义加工的各种前沿应用开发中,“信息的有效检索与精准抽取”是决定 AI 应用是否具备“生命感”的关键泵口。面对浩如烟海且充满噪声的互联网网页。如果仅仅依靠传统的关键词匹配。那么不仅会导致应用返回大量无关紧要的垃圾信息。更会因为无法将网页内容转化为 AI 易于理解的结构化上下文(Context),引发严重的 LLM(大语言模型)幻觉风险。 我们需要一种“AI 驱动、语义过滤”的搜索艺术。 tavily_dart 是一套专为 AI

OpenClaw 最新功能大揭秘!2026年最火开源AI Agent迎来史诗级升级,手机变身AI终端不是梦

OpenClaw 最新功能大揭秘!2026年最火开源AI Agent迎来史诗级升级,手机变身AI终端不是梦 大家好,我是Maynor。最近开源社区彻底炸锅了——OpenClaw(前身Clawdbot/Moltbot)又一次刷屏!这个能真正“干活”的本地AI助手,在3月2日刚刚发布v2026.3.1版本,紧接着2月底的v2026.2.26也是里程碑式更新。 从外部密钥管理、线程绑定Agent,到Android深度集成、WebSocket优先传输……OpenClaw正在把“AI常驻员工”从概念变成现实。 今天这篇图文并茂的干货,带你一口气看懂最新功能、安装上手和实战价值!

一个人就是一支影视团队:实测国内最强影视级 AI 视频创作平台 TapNow——告别抽卡,导演级精准控制

一个人就是一支影视团队:实测国内最强影视级 AI 视频创作平台 TapNow——告别抽卡,导演级精准控制

实测国内最强影视级 AI 视频平台 TapNow:告别“盲盒抽卡”,实现导演级精准调度         在过去的一年里,文生视频赛道经历了爆发式增长。但对于真正需要将 AI 投入到生产环境中的创作者、产品经理和开发者来说,目前的 AI 视频工具普遍存在一个致命痛点——不可控。        跑偏的物理规律、诡异的肢体形变、如同“开盲盒”般的提示词玄学,让很多原本充满创意的构想,最终沦为废弃的半成品。如果你也受够了这种低效的“抽卡式”创作,那么今天介绍的这款号称国内最强影视级 AI 视频创作平台——TapNow,或许能彻底重塑你的工作流。 核心痛点突破:从“AI 幻觉”到真正的物理一致性 技术社区的受众深知,评价一个 AI 视频大模型底座的强弱,不仅看它能生成多惊艳的单帧,更要看它在长镜头下的时空一致性。 TapNow 在底层架构上进行了深度优化,重点解决了以下三个核心问题: 1. 极高保真度的物理交互: 无论是光影在水面的流动、烟雾的自然消散,