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

3步快速上手CloudBeaver:轻松搭建Web数据库管理平台

3步快速上手CloudBeaver:轻松搭建Web数据库管理平台 【免费下载链接】cloudbeaverCloud Database Manager 项目地址: https://gitcode.com/gh_mirrors/cl/cloudbeaver CloudBeaver是一款强大的开源云数据库管理工具,让你通过浏览器就能统一管理多种数据库。无论你是开发人员还是数据库管理员,都能快速搭建属于自己的数据库管理平台。本指南将带你从零开始,3步完成CloudBeaver的部署和使用。 🎯 为什么选择CloudBeaver? 你是否遇到过这些问题? * 需要在不同数据库之间频繁切换,操作繁琐 * 团队成员使用不同的数据库客户端,难以统一管理 * 想要通过Web界面远程管理数据库,但找不到合适的工具 CloudBeaver正是为解决这些问题而生: * 统一管理:支持MySQL、PostgreSQL、Oracle等主流数据库 * Web界面:无需安装客户端,浏览器即可访问 * 开源免费:完全开源,无需支付任何费用 📋 环境准备检查 在开始安装前,请确保你的

Java Web 汽车票网上预订系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

Java Web 汽车票网上预订系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 随着互联网技术的快速发展,传统汽车票购票方式已无法满足现代用户的便捷性需求。线下购票存在排队时间长、信息不透明、跨区域购票困难等问题,亟需通过信息化手段优化服务流程。汽车票网上预订系统通过整合线上线下资源,为用户提供实时查询、在线选座、电子支付等功能,大幅提升购票效率和用户体验。该系统不仅解决了传统购票模式的痛点,还为交通运营企业提供了数据分析和运营优化的支持,推动行业数字化转型。关键词:汽车票预订、数字化转型、用户体验、线上支付、SpringBoot。 本系统采用前后端分离架构,后端基于SpringBoot2框架搭建,结合MyBatis-Plus实现高效数据操作,MySQL8.0作为主数据库保障数据存储的稳定性和扩展性。前端使用Vue3框架开发,通过Axios与后端交互,实现动态数据渲染和响应式布局。系统核心功能包括用户注册登录、车次查询、在线选座、订单管理、支付接口集成等,同时支持管理员对车辆信息、班次调度、用户行为等数据的可视化分析。系统设计遵循高内聚低耦合原则,确保代码可维护性和可扩展性。关键词:SpringBoot2、Vue3、MyBatis-Plus、MySQL8

双剑破天门:攻防世界Web题解之独孤九剑心法(十)

双剑破天门:攻防世界Web题解之独孤九剑心法(十)

免责声明:用户因使用公众号内容而产生的任何行为和后果,由用户自行承担责任。本公众号不承担因用户误解、不当使用等导致的法律责任 **本文以攻防世界部分题为例进行演示,后续会对攻防世界大部分的web题目进行演示,如果你感兴趣请关注** 目录 一:Lottery 二:ics-05 三:总结 一:Lottery 打开后发现这个靶场加载异常缓慢,然后他还给了源码,我们先不看源码先熟悉一下这个网站是什么 这应该是一个类似猜数字游戏,选对7个号码即可得到相应奖励 然后注册 随便输入7个数字发现一个也没中,白费2元 然后我们随便点击这个网站的功能发现如果想要flag需要有相对应的余额 我们这会的思路就是利用bp抓包看看能不能修改我们的余额 好像成功了,我们试一试能不能换flag 居然说没有足够的钱,这个方法不行只要将页面上的数字修改只要刷新就会变回原来的余额 居然不能修改余额那就看看在猜数字的页面有没有突破口,发现其访问了api.php我们继续代码审计 看到如下核心代码,首先随机生成七位数字(random_win_nums)然后将其赋值给$win_number。随后关

新手教程:如何正确完成libwebkit2gtk-4.1-0安装配置

如何在 Linux 上正确安装并配置 libwebkit2gtk-4.1:从踩坑到实战 你是不是也遇到过这种情况?刚写好一个基于 GTK 的浏览器小程序,兴冲冲地编译运行,结果终端弹出一行红色错误: error while loading shared libraries: libwebkit2gtk-4.1.so.0: cannot open shared object file 或者,在 apt install 时被告知: E: Unable to locate package libwebkit2gtk-4.1-0 别慌——这几乎是每个初次接触 WebKitGTK 开发的 Linux 新手都会踩的“入门级大坑”。 今天我们就来彻底搞懂: libwebkit2gtk-4.1 到底是什么?为什么它这么难装?