Vue状态管理工具:vuex

目录

基本概念

使用步骤

核心概念

1.State

2.Getters

3.Mutations

4.Actions

5.Modules

辅助函数

基本概念

基础用法


基本概念

官方:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

简单来说,Vuex 是实现组件全局(数据)管理的一种机制,可以方便的实现组件之间共享数据。可以把它当成一个store仓库,可以集中管理共享的数据,并且存储在vuex中的数据都是响应式的,数据与页面同步。

一般情况下,只有组件之间共享的数据,才有必要存储到vuex中;对于组件中的私有数据,依旧存储在组件自身的data中。


使用步骤

1).安装vuex

npm install vuex --save

2).引用Vuex,并创建 Store仓库

可以在一个单独的文件(如 store.js)中创建 store,并导出它以便在其他地方使用。

import Vue from 'vue';  
import Vuex from 'vuex';  Vue.use(Vuex);  const store = new Vuex.Store({  state: {  定义状态  },  mutations: {  定义改变状态的方法  },  actions: {  定义执行异步操作的方法  },  getters: {  定义计算属性  }  
});  export default store;

3).将 Store 挂载到 Vue 实例

import Vue from 'vue';  
import App from './App.vue';  
import store from './store'; // 引入上面创建的 store  new Vue({  el: '#app',  store, // 将 store 挂载到 Vue 实例上  render: h => h(App)  
});

4). 在组件中使用vuex:通过 this.$store 来访问 Vuex store 

created(){console.log(this.$store)
}

核心概念

store 仓库将包含state、mutations、actions以及从 state 中派生出一些状态的计算属性getters。

1.State

state提供唯一的公共数据源,所有共享的数据都要统一放到Store中的State中存储。当组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会响应式地更新。

const store = new Vuex.Store({// state 状态数据state: { count: 666 }
})//组件中访问
this.$store.state
2.Getters

getters允许我们对 Store 中的数据进行加工处理形成新的数据。可以被认为是 store 的计算属性。getters和computed一样具有缓存机制

如:在state.count的基础上派生出一个新的状态newCount出来

const store = new Vuex.Store({state:{count:666  },getters:{newCount:state => state.count * 3// 简化箭头函数(state) => { return state.count * 3 }}
});//组件中获取newCount
this.$store.getters.newCount;
3.Mutations

mutations是唯一更改 store 中状态的方法。mutation必须是同步函数,因为Vuex 的状态跟踪机制依赖于同步的 mutations,当 mutation 异步执行时,Vuex 无法准确地知道何时状态已经更新,这可能导致无法正确地显示状态变化

 const store = new Vuex.Store({state:{count:666},mutations:{increment(state,value){state.count += value;}}});//组件中调用
//通过commit提交一个名为increment的mutation
this.$store.commit("increment", 需要提交的值);
4.Actions

actions可以包含任意异步操作。Action 类似于 mutation,不同在于:由于异步操作不能直接更新状态,所以Action 提交的是 mutation,而不是直接变更状态。

Action 通过 context.commit 提交一个 mutation,或者通过 context.dispatch 触发其他 action

const store = new Vuex.Store({state: {count:666},mutations: {changeCount(state, num) {state.count = num}},actions: {setAsyncCount (context, num) {// 一秒后, 给一个数, 去修改 numsetTimeout(() => {context.commit('changeCount', num)}, 1000)}}
})//组件中调用
//通过dispatch调用一个名为setAsyncCount 的action
this.$store.dispatch('setAsyncCount', 888)
5.Modules

Modules每个模块拥有自己的 state、mutation、action、getter 甚至是嵌套子模块。如果把所有的状态都放在state中,随着项目的复杂化,Vuex会变得难以维护。为了方便管理,一般会将其按功能分割成不同的模块(Module)。

import Vue from 'vue';  
import Vuex from 'vuex';  
import moduleA from './module/moduleA' // 模块A
import moduleB from './module/moduleB' // 模块BVue.use(Vuex);  const store = new Vuex.Store({  state: { },  mutations: { },  actions: { },getters: { } ,modules: {moduleA,moduleB}
});  export default store;//子模块moduleA/moduleB
// 每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块
export default {state: {text: 'moduleA/moduleB'},getters: {},mutations: {},actions: {}
}//组件调用
this.$store.state.moduleA.text;

辅助函数

基本概念

一般情况下,如果需要访问vuex.store中state存放的数据,需要使用this.$store.state.属性名方式。当一个组件需要获取多个状态时候,将这些状态都声明会有些重复和冗余。为了解决这个问题,辅助函数应运而生。

通过辅助函数把vuex.store中的属性映射到vue实例身上,这样在vue实例中就能访问vuex.store中的属性了,对于操作vuex.store就变得非常方便。

属性辅助函数
statemapState
gettermapGetters
actionsmapActions
mutationsmapMutations

import { mapState, mapMutations, mapActions, mapGetters } from 'vuex'

基础用法

以下均为Vuex的辅助函数提供的语法糖的方式

1. mapState: 将state映射到组件的computed计算属性中。组件可通过访问这些计算属性来直接获取state中的状态值。

import { mapState } from 'vuex';  export default {  computed: {  ...mapState(['count']) // 将store中的count状态映射到组件的computed属性中  }  
}

使用mapState后,在组件的模板中,可以直接使用this.count来访问state中的count状态。

2.mapGetters:将getters映射到组件的computed计算属性中。与mapState类似,这样做可以方便地在组件中通过计算属性来访问getters返回的计算值。

import { mapGetters } from 'vuex';  export default {  computed: {  
// 将store中的doneTodos getter映射到组件的computed属性中  ...mapGetters(['doneTodos']) }  
}

 3. mapMutations:将mutations映射到组件的methods方法中。这样,组件就可以通过调用这些方法来直接触发mutations,从而修改state中的状态值。

import { mapMutations } from 'vuex';  export default {  methods: {  // 将store中的increment mutation映射到组件的methods中  ...mapMutations(['increment']), addCount() {  // 调用increment方法时,会自动触发store中的increment mutation this.increment();  }  }  
}

4. mapActions:将actions映射到组件的methods方法中。与mutations不同,actions主要用于处理异步操作。通过映射actions,组件可以方便地触发这些异步操作。

import { mapActions } from 'vuex';  export default {  methods: {  // 将store中的incrementAsync action映射到组件的methods中  ...mapActions(['incrementAsync']), addCountAsync() {  // 调用incrementAsync方法时,会自动触发store中的incrementAsync action  this.incrementAsync(); }  }  
}

 若有错误或描述不当的地方,烦请评论或私信指正,万分感谢 😃

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/404758.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android全面解析之context机制(三): 从源码角度分析context创建流程(下)

前言 前面已经讲了什么是context以及从源码角度分析context创建流程(上)。限于篇幅把四大组件中的广播和内容提供器的context获取流程放在了这篇文章。广播和内容提供器并不是context家族里的一员,所以他们本身并不是context,因而…

查找物理学领域文献的常用数据库

当我们查找文献时如果盲目去各个文献数据库查找不仅浪费时间和精力还不一定能找到自己需要的文献。我们需要对数据库有个简单的了解有方向的去寻找我们研究领域的文献资料,本文就向大家介绍一下查找物理学领域文献的数据库有哪些。 一、物理专业数据库(…

Android平台无纸化同屏如何实现实时录像功能

技术背景 我们在做无纸化同屏的时候,好多开发者采集到屏幕、麦克风|扬声器数据,除了需要推RTMP出去,或者启动个轻量级RTSP服务,对外提供个拉流的RTSP URL,别的终端过来拉流(小并发场景)&#x…

vue3基础ref,reactive,toRef ,toRefs 使用和理解

文章目录 一. ref基本用法在模板中使用ref 与 reactive 的区别使用场景 二. reactive基本用法在模板中使用reactive 与 ref 的区别使用场景性能优化 三. toRef基本用法示例在组件中的应用主要用途对比 ref 和 toRef 四. toRefs基本用法示例在组件中的应用主要用途对比 ref 和 t…

基于Arch的轻量级发行版Archcraft结合内网穿透实现远程SSH连接

文章目录 前言1. 本地SSH连接测试2. Archcraft安装Cpolar3. 配置 SSH公网地址4. 公网远程SSH连接5. 固定SSH公网地址6. SSH固定地址连接 前言 本文主要介绍如何在Archcraft系统中安装Cpolar内网穿透工具,并以实现Windows环境ssh远程连接本地局域网Archcraft系统来说明使用内网…

高性能web服务器详解

一、Web服务的基础介绍 正常情况下单次web服务访问的流程简图: 1.1 Web服务介绍 这里介绍的是 Apache 和 NGINX 1.1.1 Apache 经典的Web服务端 Apache 起初由美国的伊利诺伊大学香槟分校的国家超级计算机应用中心开发 目前经历了两大版本分别是 1.X 和 2.X…

笔试练习day5

目录 游游的you题目解析解法方法一贪心方法二 腐烂的苹果题目解析例子1例子2解法多源BFS最短路径代码代码解析 JZ62 孩子们的游戏(圆圈中最后剩下的数)题目解析解法方法一模拟环形链表模拟数组模拟 方法二递推/递归/动态规划状态表示状态转移方程代码 感谢各位大佬对我的支持,如…

Mysql原理与调优-Mysql的内存结构

1.绪论 前面说过InnoDB每次查询数据或者更新数据,都是先以16kb的大小将数据读取到内存中,然后对内存中的数据页进行操作。为了减少磁盘IO,Innodb的会先单独的申请一块连续的空间,将从磁盘中的数据页缓存到这片内存中。这片内存就…

2D Inpainting 与NeRF 3D重建的多视角一致性问题

一 问题: NeRF依赖于输入图像的一致性。NeRF(Neural Radiance Fields)在生成三维场景时,依赖于从多个视角拍摄的输入图像之间的一致性来准确地推断场景的三维结构和颜色信息。 具体来说: 多视角一致性: Ne…

Hive3:三种常用的复杂数据类型

一、Array类型 1、数据示例 2、实操 元数据 zhangsan beijing,shanghai,tianjin,hangzhou wangwu changchun,chengdu,wuhan,beijin创建表 CREATE TABLE myhive.test_array(name string, work_locations array<string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY \t…

LVM 使用以及配置

逻辑卷管理 (LVM) 是一种用于 Linux 系统的存储管理工具&#xff0c;比传统的磁盘分区方法更灵活。LVM 通过将物理存储设备组合成逻辑卷&#xff0c;使得磁盘空间的管理更加动态和便捷。它提供了物理层的抽象&#xff0c;让用户可以创建跨越多个物理磁盘或分区的逻辑卷。 LVM …

2024年软件测试经典面试题(全三篇)【包含答案】做完面试进入大厂不是梦

前言 迎来的便是金九银十&#xff0c;一直想着说分享一些软件测试的面试题&#xff0c;这段时间做了一些收集和整理&#xff0c;下面共有三篇经典面试题&#xff0c;大家可以试着做一下&#xff0c;答案附在后面&#xff0c;希望能帮助到大家。 软件测试经典面试题&#xff0…

【vue讲解:es6导入导出语法、 vue-router简单使用、登录跳转案例、scoped的使用、elementui使用】

1 es6导入导出语法 # 做项目&#xff1a;肯定要写模块--》导入使用# 默认导出和导入 在某个js中 # 命名导出和导入1.1 默认导出和导入 // #########导出语法########### // export default name // 只导出变量 // export default add // 只导出函数// export default {nam…

android13顶部状态栏里面调节背光 背景闪烁问题

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.代码分析 4.代码修改 5.彩蛋 1.前言 android13顶部状态栏里面调节背光, 背景闪烁问题,会出现画面不全问题,如下图 2.问题分析 这里看起来是由于隐藏的时候,界面显示是一个渐变的隐藏,但是后面的背景又是…

Vue3列表(List)

效果如下图&#xff1a;在线预览 APIs List 参数说明类型默认值bordered是否展示边框booleanfalsevertical是否使用竖直样式booleanfalsesplit是否展示分割线booleantruesize列表尺寸‘small’ | ‘middle’ | ‘large’‘middle’loading是否加载中booleanfalsehoverable是否…

stripe Element 如何使用

这里要准备好几个东西&#xff1a; 一个支付成功过后的回调 还有一个下单的接口 一旦进入这个下单界面&#xff0c;就要去调下单的接口的&#xff0c;用 post, 这个 接口你自己写&#xff0c;可以写在后端中&#xff0c;也可以放到 nextjs 的 api 中。 首先说的是这个下单…

Linux ubuntu 24.04 运行《文明5》游戏,解决游戏中文设置的问题!

Linux ubuntu 24.04 运行《文明5》游戏&#xff0c;解决游戏中文设置的问题&#xff01; 《文明5》是一款回合制经营策略游戏&#xff0c;拼的就是科技发展速度&#xff0c;点的是科技树&#xff0c;抢的就是科技制高点&#xff0c;但是真的是时间漫长&#xff0c;可能需要好几…

会“坐”电梯,能避障碍,AGV无人搬运车进入各行各业

AGV 近年来&#xff0c;自动导引车&#xff08;Automated Guided Vehicle&#xff0c;简称AGV&#xff09;作为一种先进的物流设备&#xff0c;在制造业中广泛应用。AGV是一种能够自主行驶的无人驾驶车辆&#xff0c;通过内置的导航系统和传感器&#xff0c;实现对环境的感知与…

keepalived总结

一、概述 定义&#xff1a;Keepalived是一个用于实现服务器高可用性和负载均衡的软件&#xff0c;通过VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;虚拟路由器冗余协议&#xff09;实现故障转移。主要功能&#xff1a; 高可用系统网络服务&#xff1a;能够…

leetcode:1512. 好数对的数目(python3解法)

难度&#xff1a;简单 给你一个整数数组 nums 。 如果一组数字 (i,j) 满足 nums[i] nums[j] 且 i < j &#xff0c;就可以认为这是一组 好数对 。 返回好数对的数目。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,1,1,3] 输出&#xff1a;4 解释&#xff1a;有 4 组好…