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也发布了 ...
随机推荐
- Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
Deepseek卡的问题已经有几周了,还有同学没有解决这个问题? 今天就来教大家如何白嫖阿里云的Deepseek-R1满血版,新用户享受100万token额度,相当的富裕,可以随便用了.并且还配用AP ...
- LVGL 8.3.0常用函数快速使用
LVGL 8.3.0使用快速上手教程(使用篇) 定义页面通用样式style // 创建页面样式 static lv_style_t style; lv_style_init(&style); ...
- 基于Potplayer类播放器或Action!类录屏软件调取摄像头方式的定时抓拍保存图像方法小结
前面已经总结了基于Maxmspjitter的相关方法,还有基于Unity的,还有基于Openframeworks的,今天来一篇基于普通软件的: 1.专业播放器类的软件,如Potplayer.vlc.o ...
- day2-变量与数据类型
变量 概念:程序的基本组成单位 定义: 指定变量类型 根据值自行判断变量类型(类型推导) 省略var,定义赋值 var i int var i = 10 i, j := 20, 10 数据基本类型 基 ...
- 【记录】C++STL容器/特有类 使用积累
STL容器共有成员函数 size() max_size() empty() begin() end() clear() [链接]csdn_STL中所有容器共有成员函数 双端队列deque 1.创建与初 ...
- 基于React的虚拟滚动方案
基于React的虚拟滚动方案 在渲染列表时我们通常会一次性将所有列表项渲染到DOM中,在数据量大的时候这种操作会造成页面响应缓慢,因为浏览器需要处理大量的DOM元素.而此时我们通常就需要虚拟滚动来实现 ...
- 最新版 Proteus 8.15 Professional 图文安装教程(附安装包)
前言 大家好,我是梁国庆. Proteus 是世界上唯一将电路仿真软件.PCB设计软件和虚拟模型仿真软件三合一的设计平台. 本篇博主将手把手带领大家安装最新版 Proteus 8.15. 若图片加载超 ...
- 基于OpenSSL的密码管理系统-应用密码学课程报告
第1章 概要设计 1.1 设计目的 本研究旨在设计并实现一个基于OpenSSL的密码管理系统,该系统具备密钥对的生成.密钥上传.密钥的核对.身份认证.文件与邮件的加密和解密.数字签名及数字证书管理等常 ...
- 入门Dify平台:如何根据需求选择与创建最合适的应用
今天我们将继续深入讲解Dify,重点介绍如何创建应用.具体来说,我们将探讨如何根据不同的需求来决定选择什么类型的应用最为合适,帮助大家更好地理解在Dify平台上构建应用的最佳实践. 创建空白应用 首先 ...
- Redis 原理 - List
List 数据结构 Redis 3.2 前,使用 压缩列表zipList 或 双向链表linkedList 当同时满足下面两个条件时,使用zipList存储数据 list保存的每个元素长度小于64字节 ...