Vuex核心知识整理

目录

1 搭建vuex环境

2 求和案例

3 getters 配置项

4 mapState 和 mapGetters

5 mapMutations 和 mapActions

6 Vuex 模块化


1 搭建vuex环境

vuex工作原理图(摘自官网

什么时候使用Vuex:

1.当多个组件依赖于统一状态

2.来自不同组件的行为需要变更同一状态 


(1). 首先再src目录下创建store文件夹,然后创建index.js文件(该文件用于创建 vuex 中最为核心的 store), 然后在main.js中引入这个index.js文件

【index.js】

/* 该文件用于创建 vuex 中最为核心的 store */
// 引入Vue
import Vue from 'vue'// 引入vuex
import Vuex from 'vuex'// 使用插件
Vue.use(Vuex)// 1. 准备actions: 用于响应组件中的动作
const actions = {/* 没有业务逻辑的,可以直接跳过这步,直接commit */// jia(context, num) {//     context.commit('JIA', num)// },// jian(context, num) {//     context.commit('JIAN', num)// },/* 有业务逻辑的 */jiaOdd(context, num) {if (context.state.sum % 2) {context.commit('JIA', num)}},jiaWait(context, num) {setTimeout(() => {context.commit('JIA', num)}, 1000)},
}// 2. 准备mutations: 用于操作数据(state)
const mutations = {JIA(state, num) {// console.log(num)state.sum += num},JIAN(state, num) {state.sum -= num}
}// 3. 准备state: 用于保存数据
const state = {sum: 0,  // 当前的和
}/* 创建并暴露store */
export default new Vuex.Store({actions,mutations,state
})

2 求和案例

【Count】

<template><div><h1>当前求和为:{{ $store.state.sum }}</h1><select v-model.number="num"><option value="1">1</option><option value="2">2</option><option value="3">3</option></select><button @click="add">+</button><button @click="sub">-</button><button @click="addIfOdd">当前求和为奇数再加</button><button @click="addWait">等一等再加</button></div>
</template><script>export default {name: 'Count',data() {return {num: 1, //用户选择的数字}},methods: {/* 没有业务处理,直接commit, 联系mutations */add() {this.$store.commit('JIA', this.num)},sub() {this.$store.commit('JIAN', this.num)},/* 有业务处理,先dispatch, 联系actions,再commit, 联系mutations */addIfOdd() {this.$store.dispatch('jiaOdd', this.num) },addWait() {this.$store.dispatch('jiaWait', this.num)}},}</script><style>button {margin-left: 8px;}
</style>

在组件中使用处理过后的数据时(比如上方的sum ),用 {{ $store.state.sum }} 


3 getters 配置项

【index.js】

......
// 3. 准备state: 用于保存数据
const state = {sum: 0,  // 当前的和school: '北京大学',subject: '计算机'
}// getters: 用于将state中的数据进行加工
const getters = {bigSum(state) {return state.sum * 10}
}/* 创建并暴露store */
export default new Vuex.Store({actions,mutations,state,getters
})

【Count】

在组件中使用getters中加工后的数据 

<h3>放大十倍的和为:{{ $store.getters.bigSum }}</h3>

4 mapState 和 mapGetters

在上述的案例中,当我们需要使用state或者getters中的数据时,在组件中的模板中,需要写 $store.state.xx, 这样写的话,不够精简。以下将介绍几种方法,利用计算属性去处理这种不足之处

【state和getters中的数据】

// 3. 准备state: 用于保存数据
const state = {sum: 0,  // 当前的和school: '北京大学',subject: '计算机'
}// 。getters: 用于将state中的数据进行加工
const getters = {bigSum(state) {return state.sum * 10}
}

【在组件中导入】

import { mapState, mapGetters } from 'vuex'

1. 获取state中的数据: 

【方法1】靠程序员自己手写计算属性

.......
computed: {/* 1.靠程序员自己去写计算属性 */he() {return this.$store.state.sum},xuexiao() {return this.$store.state.school},xueke() {return this.$store.state.subject},
}

<h1>当前求和为:{{ sum }}</h1>
<h3>我在:{{ xuexiao}}, 学习{{ xueke}}</h3>

【方法2】使用vuex的mapState生成计算属性,从state中获取数据  (对象写法)

computed: {// ..........mapState({he:'sum', xuexiao:'school', xueke:'subject'}),  // 使用扩展运算符展开对象
}

【方法3】使用vuex的mapState生成计算属性,从state中获取数据  (数组写法)

computed: {// .........mapState(['sum', 'school', 'subject']),
}

使用数组写法的前提是:计算属性的属性名和state中的数据的名称是相同的


2. 获取getters中的数据: 

【方法1】使用vuex的mapGetters生成计算属性,从getters中获取数据  (对象写法)

computed: {// .........mapGetters({bigSum:'bigSum'})
}

【方法2】使用vuex的mapGetters生成计算属性,从getters中获取数据  (数组写法)

computed: {// .........mapGetters(['bigSum'])
}

前提和上面一样


5 mapMutations 和 mapActions

当我们在组件中想要联系actions 或者 mutations 时,我们需要使用this.$store.dispatch(...) 或者 this.$store.commit(...) 这样写的话,如果有多个就会写很多重复的 this.$store.dispatch ......

所以我们可以使用mapMutations和mapActions来解决这种问题

【在组件中导入】

import { mapMutations, mapActions } from 'vuex'

1. 联系mapMutations:

【方法1】借助vuex的mapMutations生成方法,方法中调用commit方法去联系 mutations (对象的写法)

methods: {// .........mapMutations({add: 'JIA', sub: 'JIAN'}),
}

【方法2】借助vuex的mapMutations生成方法,方法中调用commit方法去联系 mutations (数组的写法)

methods: {// ..........mapMutations(['JIA', 'JIAN']),  // 函数名也要改成对应的JIA、JIAN
}

2. 联系mapActions:

【方法1】借助mapActions 对象的写法

methods: {// .........mapActions({addIfOdd: 'jiaOdd', addWait: 'jiaWait'})
}

【方法2】借助mapActions 数组的写法

methods: {// ......    ...mapActions(['addIfOdd', 'addWait'])
}

但是使用上述方法时,并不会传递参数,如果不指定参数的话,会默认传递事件对象 event, 所以计算结果会出错,所以我们需要在 <template></template>中指定传递的参数

    <button @click="add(num)">+</button><button @click="sub(num)">-</button><button @click="addIfOdd(num)">当前求和为奇数再加</button><button @click="addWait(num)">等一等再加</button>

6 Vuex 模块化

【index.js】

/* 该文件用于创建 vuex 中最为核心的 store */
// 引入Vue
import Vue from 'vue'// 引入vuex
import Vuex from 'vuex'import axios from 'axios'import nanoid from 'nanoid'// 使用插件
Vue.use(Vuex)/* 1.求和功能相关的配置 */
const countOptions = {namespaced: 'true',actions: {jiaOdd(context, num) {if (context.state.sum % 2) {context.commit('JIA', num)}},jiaWait(context, num) {setTimeout(() => {context.commit('JIA', num)}, 1000)},},mutations: {JIA(state, num) {// console.log(num)state.sum += num},JIAN(state, num) {state.sum -= num},ADD_PERSON(state, person) {state.personList.unshift(person)},},state: {sum: 0,  // 当前的和school: '北京大学',subject: '计算机',},getters: {bigSum(state) {return state.sum * 10}}
}/* 2.人员功能相关的配置 */
const personOptions = {namespaced: 'true',actions: {addPersonxie(context, person) {if (person.name.indexOf('谢') === 0) {context.commit('ADD_PERSON', person)} else {alert('添加的人必须姓谢')}}, addPersonServer(context) {axios.get('https://api.uixsj.cn/hitokoto/get?type=social').then(response => {context.commit('ADD_PERSON', {id: nanoid(), name: response.data})},error => {console.log(error.message)})}},mutations: {ADD_PERSON(state, person) {state.personList.unshift(person)}},state: {personList: [{id:'001', name:'zs'}]},getters: {firstPersonName(state) {return state.personList[0].name}}
}/* 创建并暴露store */
export default new Vuex.Store({modules: {count: countOptions,person: personOptions}
})

使用模块化时,state中就变成了count 和 person两个被导出的模块,而具体的数据就在对应的模块中

在模板中就可以使用以下方式使用数据  {{ count.xx}} 、 {{ person.xx}}

    <h1>当前求和为:{{ count.sum }}</h1><h2>放大十倍的和为:{{ bigSum }}</h2><h3>我在:{{ count.school }}, 学习{{ count.subject }}</h3><h4 style="color: red;">Perosn组件的总人数是: {{ person.personList.length }}</h4>

但是这样写的话,模板中的写法还是过于繁琐,所以我们可以将所需要的数据指定所在的模块中,然后就可以直接用了。

// 这里以对象的写法为例
...mapState('count', ['sum', 'school', 'subject']),  // 需要配置namespaced:true


         methods: {...mapMutations('count', {add: 'JIA', sub: 'JIAN'}),...mapActions('count', {addIfOdd: 'jiaOdd', addWait: 'jiaWait'})},

模块化有一个好处就是,可以将每一个模块放入一个.js文件中,然后在store/index.js 文件中引入,这样方便多个程序员根据自己的需要操作对应放入模块

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

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

相关文章

安装faiss环境教程

文章目录 打开环境安装faiss环境检查已安装的环境切换环境至faiss 打开环境 source activate # 打开环境安装faiss环境 conda create -n faiss_env # 安装faiss环境检查已安装的环境 conda info --envs # 检查已安装的环境切换环境至faiss conda a…

【51单片机实验笔记】开关篇(二) 矩阵按键

目录 前言原理图分析矩阵按键扫描算法 软件实现1. 矩阵键盘检测2. 简易计算器实现 总结 前言 本节内容&#xff0c;我们学习一下矩阵按键&#xff0c;它是独立按键的阵列形式&#xff0c;常见的应用即键盘。 本节涉及到的封装源文件可在《模块功能封装汇总》中找到。 本节完…

人工智能学习与实训笔记(一):零基础理解神经网络

人工智能专栏文章汇总&#xff1a;人工智能学习专栏文章汇总-CSDN博客 本篇目录 一、什么是神经网络模型 二、机器学习的类型 2.1 监督学习 2.2 无监督学习 2.3 半监督学习 2.4 强化学习 三、网络模型结构基础 3.1 单层网络 ​编辑 3.2 多层网络 3.3 非线性多层网络…

CSS篇--transform

CSS篇–transform 使用transform属性实现元素的位移、旋转、缩放等效果 位移 // 语法 transform:translate(水平移动距离&#xff0c;垂直移动距离) translate() 如果只给一个值&#xff0c;表示x轴方法移动距离 单独设置某个方向的移动距离&#xff1a;translateX() transla…

jwt+redis实现登录认证

项目环境&#xff1a;spring boot项目 pom.xml引入jwt和redis <!-- jwt --><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>4.3.0</version></dependency><!-- redis坐标-->…

Midjourney绘图欣赏系列(四)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

手把手一起开发SV4E-I3C设备(二)

JEDEC DDR5 SPD Hub Devices例程 DDR5生态系统的核心是SidebandBus Protocol 参考下图&#xff0c;可以将SV4E-I3C的端口1声明为主服务器(模拟主机控制器)&#xff0c;并且它可以属于SV4E-I3C上的一个总线。端口2可以作为SPD Hub DUT的Local Bus侧的从站连接。这个从站可以被…

2.17C语言学习

P1678 烦恼的高考志愿 写完后发现题解里面用的是优先队列或者二分什么的&#xff0c;其实这个题可以贪心&#xff0c;我们把学校的分数线和学生的成绩分别进行排序&#xff0c;然后从前往后遍历&#xff0c;每次比较当前学校的分数与学生成绩的差距和下一个学校的分数与学生成…

Linux CentOS stream 9 安装docker

在计算机技术中,虑拟化是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分区、组合为一个或多个电脑配置环境。 目前,大多数服务器的容量的利用率不足15%,这导致服务器数量激增以及增加了复杂性。服务…

(二)【Jmeter】专栏实战项目靶场drupal部署

该专栏后续实战示例&#xff0c;都以该篇部署的项目展开操作。 前置条件 参考“&#xff08;一&#xff09;【Jmeter】JDK及Jmeter的安装部署及简单配置” 安装部署Jmeter&#xff0c;从文章最后下载“Postman、Rancher.ova、VirtualBox-7.0.12-159484-Win.exe、Xshell-7.0.01…

【第三十六节】工程与模块管理

IDEA 项目结构 层级关系&#xff1a; project&#xff08;工程&#xff09;-module&#xff08;模块&#xff09;-package(包)-class&#xff08;类&#xff09; 具体的&#xff1a; 一个project中可以创建多个module 一个module可以创建多个package 一个package中可以创…

[C# WPF] DataGrid选中行或选中单元格的背景和字体颜色修改

问题描述 WPF中DataGrid的选中行或选中者单元格&#xff0c;在焦点失去后&#xff0c;颜色会很淡&#xff0c;很不明显&#xff0c;不容易区分。 解决方法 在失去焦点的情况下&#xff0c;如何设置行或单元格与选中的时候颜色一样&#xff1f; <DataGrid.Resources>&…

如何在Spring Boot中启用HTTPS?

在Spring Boot中启用HTTPS是一个增强应用程序安全性的重要步骤。下面我将介绍如何将一个Spring Boot项目配置成支持HTTPS协议。 引入 在现代的网络通信中&#xff0c;安全性成为了一个不能忽视的要求。特别是当我们谈论到数据传输时&#xff0c;保护用户信息的安全性是非常重要…

【大厂AI课学习笔记】【2.1 人工智能项目开发规划与目标】(2)项目开发周期

我们来学习项目开发的周期。 再次声明&#xff0c;本文来自腾讯AI课的学习笔记&#xff0c;图片和文字&#xff0c;仅用于大家学习&#xff0c;想了解更多知识&#xff0c;请访问腾讯云相关章节。如果争议&#xff0c;请联系作者。 今天&#xff0c;我们来学习AI项目的周期。 主…

黑马鸿蒙教程学习1:Helloworld

今年打算粗略学习下鸿蒙开发&#xff0c;当作兴趣爱好&#xff0c;通过下华为那个鸿蒙开发认证&#xff0c; 发现黑马的课程不错&#xff0c;有视频和完整的代码和课件下载&#xff0c;装个devstudio就行了&#xff0c;建议32G内存。 今年的确是鸿蒙大爆发的一年呀&#xff0c;…

【以解决】Pyinstaller打包报错IndexError: tuple index out of range

问题 这个问题主要是在Python3.7以上的版本中遇到&#xff0c;用pyinstaller打包的时候发现报错 (pyinstallerEnv) D:\virtualEnv\pyinstallerEnv\Scripts>auto-py-to-exe pygame 2.5.2 (SDL 2.28.3, Python 3.10.0) Hello from the pygame community. https://www.pygame…

人工智能学习与实训笔记(四):神经网络之NLP基础—词向量

人工智能专栏文章汇总&#xff1a;人工智能学习专栏文章汇总-CSDN博客 本篇目录 四、自然语言处理 4.1 词向量 (Word Embedding) 4.1.1 词向量的生成过程 4.1.2 word2vec介绍 4.1.3 word2vec&#xff1a;skip-gram算法的实现 4.2 句向量 - 情感分析 4.2.1 LSTM (Long S…

第六节笔记:OpenCompass 大模型评测

视频链接&#xff1a;https://www.bilibili.com/video/BV1Gg4y1U7uc/?spm_id_from333.788&vd_source3bbd0d74033e31cbca9ee35e111ed3d1

普中51单片机学习(六)

点亮第一个LED LED相关知识 LED,即发光二极管&#xff0c;是一种半导体固体发光器件。工作原理为&#xff1a;LED的工作是有方向性的&#xff0c;只有当正级接到LED阳极&#xff0c;负极接到LED的阴极的时候才能工作&#xff0c;如果反接LED是不能正常工作的。其原理图如下 …

【机器学习】机器学习常见算法详解第4篇:KNN算法计算过程(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习&#xff0c;伴随浅显易懂的数学知识&#xff0c;让大家掌握机器学习常见算法原理&#xff0c;应用Scikit-learn实现机器学习算法的应用&#xff0…