vue3 基础-Vuex 全局数据状态管理
针对页面间, 组件间的数据共享问题, Vue 提供一个数据管理框架 Vuex, 早期主要是用于 Vue2 , 而现在用 Vue3 也是可以正常使用, 但在 Composition API 下则会感到这个数据管理流程不论同步还是异步, 总感觉有点繁琐和反人类, 确实是不如它的竞品 Pinia, 但还是相对成熟, 也许后面再慢慢过渡吧.
- Vuex 能创建一个全局唯一的 store(仓库), 用来存放全局的数据
- Vuex 是一个响应式的数据状态管理框架 , 状态修改需要显示地提交 commit 一个任务流程

演示环境搭建
Vue3 + Vite
首先得安装 NodeJs 环境, 然后我这里的 node 版本是 v16, Npm 版本是 8.5, 创建一个项目文件夹 vue3+vite
# 0. 安装 NodeJs 的环境
C:\Users\Desktop\vue3+vite>npm -v
8.5.0
C:\Users\Desktop\vue3+vite>node -v
v16.14.2
通过 vite 官网介绍, 创建 vue3 的项目, 项目名称为 youge, 然后进项项目初始化并启动, 如下:
# npm 7+, extra double-dash is needed:
-- 1. 创建项目
npm create vite@latest youge -- --template vue
Done. Now run:
cd youge
npm install
npm run dev
-- 2. 进入项目文件夹
C:\Users\Desktop\vue3+vite>cd youge
-- 3. 初始化项目
C:\Users\Desktop\vue3+vite\youge>npm install
added 25 packages in 5s
-- 4. 重启项目并在浏览器运行
C:\Users\Desktop\vue3+vite\youge>npm run dev
VITE v4.5.0 ready in 1379 ms
➜ Local: http://127.0.0.1:5173/
➜ Network: use --host to expose
➜ press h to show help
这里的 vue 代码高亮和拼写提示 的 vscode 插件是 Volar 和 vue3-snippets-for-vscode
安装上 vuex
这里的版本选择 4x , 安装如下:
npm install vuex@next --save
在项目 src 下创建一个名为 store 的文件夹, 里面创建一个名为 index.js 的文件
import { createStore } from 'vuex'
const store = createStore({
state() {
return {
name: "youge",
count: 666
}
},
// 同步操作
mutations: {
increment(state) {
state.count++
}
},
// 异步操作
actions: {
}
})
export default store
然后在 main.js 中对 store 进行全局引入
import { createApp } from 'vue'
import App from './App.vue'
import store from './store'
const app = createApp(App)
app.use(store)
app.mount('#app')
Vuex 数据管理
数据获取
在 App 这个演示组件 (页面) 模板中,
- 行内写法: 在 template 中, 可直接通过 $store.state.xxx 获取数据, 适合简单场景
- 数据写法: 在 script 中通过 vuex 提供的 useStore 进行实例化, 配合 computed 进行获取
<!-- App.vue -->
<template>
<div>
<p>直接获取 state 中的数据: </p>
<p>行内: {{ $store.state.name }}</p>
<p>脚本: {{ count }}</p>
</div>
</template>
<script setup>
import { computed } from 'vue'
import { useStore } from 'vuex'
const store = useStore()
const count = computed(() => store.state.count)
</script>
显示如下:
直接获取 state 中的数据:
行内: youge
脚本: 666
同步任务修改: Mutations
可直接在 DOM 中进行行内的写法, 直接进行 $store.commit('同步触发', 参数值)
<!-- App.vue -->
<template>
<div>
<p>直接获取 state 中的数据: </p>
<p>行内: {{ $store.state.name }}</p>
</div>
<button @click="$store.commit('changeName', 'jack')">修改全局的姓名</button>
<p>其他组件也引用 name 值: {{ $store.state.name }}</p>
</template>
当然通过在 script 中写也是一样的. useStore 进行实例进行 commit 也一样.
<!-- App.vue -->
<template>
<div>
<p>直接获取 state 中的数据: </p>
<p>行内: {{ $store.state.name }}</p>
</div>
<button @click="handleClick('jack')">修改全局的姓名</button>
<p>其他组件也引用 name 值: {{ $store.state.name }}</p>
</template>
<script setup>
import { ref } from 'vue'
import { useStore } from 'vuex'
const store = useStore()
const handleClick = (name) => store.commit('changeName', name)
</script>
即该按钮向 store 显式 commit 了一个任务叫 'changeName' 并携带了一个参数 'jack' 过来. 因此在 store 中同步进行处理如下:
import { createStore } from 'vuex'
const store = createStore({
state() {
return {
name: "youge",
count: 666
}
},
// 同步操作
mutations: {
// 处理由上例按钮提交过来的同步任务: changeName
changeName(state, name) {
state.name = name
}
},
})
export default store
则当页面进行按钮点击的时候, 就会修改全局数据了, 且是响应式的, 即可全局的 name: youge, 改成了 name: jack
直接获取 state 中的数据:
行内: jack
点击: 修改全局的姓名
其他组件也引用 name 值: jack
总结一下关于同步操作的步骤就是直接提交任务到 mutations 即可:
- 提交 dom 中 @click="$store.commit('changeName', 'jack')" 同步任务
- 处理 dom 中 提交过来的任务, 即在 store 的 mutations 中定义 changeName(state, name) 方法
- 应用 dom 中 可直接通过 $store.state.xxx 直接应用全局数据即可
异步任务修改: Actions
当处理异步任务时, 如用户登录, 获取用户信息, 权限, 用户退出等, vuex 就不让直接 commit 给 mutations 了. 它的操作是先通过 dom 先给 actions 派发 (dispatch ) 一个任务或事件A, 然后通过在 actions 中 commit 一个事件B 给到 mutations, 然后 在 mutations 中完成对事件B 的处理.
就是, 我感觉有点啰嗦, 没有 Piana 那样不区分同步和异步任务, 直接干就行. 但还是演示一下吧.

先在 dom 中进行异步任务派发 一个异步事件, 如叫 'asyncChangeName'
<!-- App.vue -->
<template>
<div>
<p>直接获取 state 中的数据: </p>
<p>行内: {{ $store.state.name }}</p>
</div>
<button @click="handleClick('jack')">异步修改全局的姓名</button>
<p>其他组件也引用 name 值: {{ $store.state.name }}</p>
</template>
<script setup>
import { useStore } from 'vuex'
const store = useStore()
const count = computed(() => store.state.count)
// 异步修改全局 name: 先 dispatch -> actions -> commit -> xxx
const handleClick = (name) => store.dispatch('asyncChangeName', name)
</script>
或者也写成内行的方式在 dom 上
<!-- App.vue -->
<template>
<div>
<p>直接获取 state 中的数据: </p>
<p>行内: {{ $store.state.name }}</p>
</div>
<button @click="$store.dispatch('asyncChangeName', 'jack')">异步修改</button>
<p>其他组件也引用 name 值: {{ $store.state.name }}</p>
</template>
然后 store 中的 actions 进行接收 'asyncChangeName', 并再提交给 mutaions , 让其进行处理.
import { createStore } from 'vuex'
const store = createStore({
state() {
return {
name: "youge",
}
},
// 同步操作
mutations: {
changeName(state, name) {
state.name = name
}
},
// 异步操作
actions: {
// 这里的 name 就是节点 dispatch 过来的实参 'jack'
asyncChangeName({ commit }, name) {
// 模拟异步, 等 2s 后再进行提交, 在实际中可以结合 Promise 进行状态管理, 如用户登录处理
setTimeout(() => {
commit('changeName', name)
}, 2000);
}
}
})
export default store
然后点击按钮后, 等待 2 秒, 数据发生了改变.
就这个异步处理流程来说, 直观上感觉 actions 像一个二道贩子, 中间转手一道, 最后还是 commit 给了 mutations 进行处理. 这和我司的渠道很像, 就 mutations 是直供, 省公司直接到门店; 这个 actions 是传统二代, 即省代 - 二代 - 门店.
但从结果来看, 各种模式都有各自的优缺点, 只能有持续经营, 都是可行的.
总结一下关于异步操作的步骤, 即要通过 actions 转一手到 mutaions :
- 提交 dom 中 @click="$store.dispatch('asyncChangeName', 'jack')" 异步任务
- 处理 dom 中 接收异步任务 即在 store 的 actions 中定义 asyncChangeName({ commit }, name) 方法
- 在 asyncChangeName 中通过 commit 给 mutations 里面的方法 (changeName) 进行实际处理
- 应用 dom 中 可直接通过 $store.state.xxx 直接应用全局数据即可
也是兴趣之余, 写了两个项目才真正搞清楚这个 vuex 的基本流程, 学习这个事情就还是,
纸上来得终觉浅, 绝知此事要躬行.
vue3 基础-Vuex 全局数据状态管理的更多相关文章
- vuex(vue状态管理)
vuex(vue状态管理) 1.先安装vuex npm install vuex --save 2.在项目的src目录下创建store目录,并且新建index.js文件,然后创建vuex实例,引入 ...
- 使用 react 的 hooks 进行全局的状态管理
使用 react 的 hooks 进行全局的状态管理 React 最新正式版已经支持了 Hooks API,先快速过一下新的 API 和大概的用法. // useState,简单粗暴,setState ...
- VueX(vue状态管理)简单小实例
VueX:状态管理 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 核心模块:State. ...
- vue3 自己做一个轻量级状态管理,带跟踪功能,知道是谁改的,还能定位代码。
上一篇 https://www.cnblogs.com/jyk/p/14706005.html 介绍了一个自己做的轻量级的状态管理,好多网友说,状态最重要的是跟踪功能,不能跟踪算啥状态管理? 因为vu ...
- 转 理解vuex -- vue的状态管理模式
转自:https://segmentfault.com/a/1190000012015742 vuex是什么? 先引用vuex官网的话: Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 ...
- vuex -- vue的状态管理模式
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 状态管理模式.集中式存储管理 一听就很高大 ...
- 5分钟带你入门vuex(vue状态管理)
如果你之前使用过vue.js,你一定知道在vue中各个组件之间传值的痛苦,在vue中我们可以使用vuex来保存我们需要管理的状态值,值一旦被修改,所有引用该值的地方就会自动更新,那么接下来我们就来学习 ...
- computed 和 watch 组合使用,监听数据全局数据状态
我要实现的就是,当接口返回数据时,我在任何组件中都能感知到到该数据的变化,然后根据业务逻辑进行处理.展示. 实现这个效果的方式很多,比如当接口返回数据后,就emit这数据,在另外组件中on接收渲染即可 ...
- vuex 状态管理 通俗理解
解释:集中响应式数据管理,一处修改多处使用,主要应用于大中型项目. 安装: 第一:index.js:(注册store仓库) npm install vuex -D // 下载vuex import V ...
- 微信小程序全局状态管理 wxscv
微信小程序中,数据状态不同页面中不能跨页面同步更新,也就是缺失类似vuex,mobx,redux全局的数据状态管理功能. 有些人移植了这些库,但是毕竟不是微信小程序生态的东西. Tencent也发布了 ...
随机推荐
- 发那科机器人R2000iC齿轮箱维修方法步骤归纳
一.发那科机器人R2000iC齿轮箱常见故障类型及原因 齿轮磨损:长时间的重载工作或润滑不良可能导致齿轮磨损,表现为噪音增大.振动加剧等. 轴承故障:轴承承受了齿轮箱的径向和轴向载荷,其故障可能导致齿 ...
- Spark - [04] RDD编程
题记部分 一.RDD编程模型 在 Spark 中,RDD 被表示为对象,通过对象上的方法调用来对 RDD 进行转换.经过一系列的 transformations 定义 RDD 之后,就可以调用 a ...
- JS代码执行
- RTC、直播、点播技术对比|腾讯云/即构/声网如何 选型 2025 版
前言 作为一个有多年实战经验的开发者,在音视频技术领域我深刻体会到 RTC(实时通信).直播和点播三者的不同.虽然它们的核心都涉及音视频内容的传输,但在实际应用中,它们的技术实现.使用场景以及所面临的 ...
- 【译】Visual Studio 中新的强大生产力特性
有时候,生活中的小事才是最重要的.在最新版本的 Visual Studio 中,我们增加了一些功能和调整,目的是让您脸上带着微笑,让您更有效率.这里是其中的一些列表,如果您想要完整的列表,请查看发行说 ...
- DevEco Studio 常用设置【自用】
设置为中文 API参考设置悬浮 始终定位打开的文件,单击预览免打开 保存时自动格式化和热更新 属性单独一行
- 模型蒸馏(Distillation)案例--从DeepSeek-R1-1.5B 到 Qwen-2.5-1.5B 的模型蒸馏
DeepSeek-R1-1.5B 到 Qwen-2.5-1.5B 的模型蒸馏(Distillation) 本文重点进行DeepSeek-R1-1.5B 到 Qwen-2.5-1.5B 的模型蒸馏(Di ...
- ATT&CK实战系列(三)红日靶场3
本次打靶练习是一个黑盒测试.没有密码,我们的目标是拿到域控制器的权限,并找到其中的重要文件. 网络拓扑 网卡设置 centos为出网机,第一次运行,需重新获取桥接模式网卡ip. 需重启网络服务serv ...
- 工作日记-storm集群业务崩溃和解决方案
背景 昨天公司业务部门报告业务崩溃,查看各个业务节点后,定位问题到storm集群. 打开storm ui查看下任务状态,发现可以加载页面元素,但是无法加载数据,分析是nimbus挂掉了,重启nimbu ...
- 【SpringCloud】Zookeeper服务注册与发现
Zookeeper服务注册与发现 Eureka停止更新了,你怎么办 https://github.com/Netflix/eureka/wiki SpringCloud整合Zookeeper替代Eur ...