【Vue】vuex的getters mapState mapGetters mapMutations mapActions的使用

目录

一、getters 

二、 mapState

三、 mapGetters

四、 mapMutations

五、 mapActions

学到这儿来个小总结:四个map方法的使用

总结不易~ 本章节对我有很大的收获, 希望对你也是!!!


 本节素材已上传至Gitee:yihaohhh/我爱Vue - Gitee.comhttps://gitee.com/liu-yihao-hhh/i-love---vue/tree/master/25_src_%E6%B1%82%E5%92%8C%E6%A1%88%E4%BE%8B_getters

通过前面介绍的vuex功能还是十分强大,但是对于模板中有很多不同需求的话,我们就不要自己来写js表达式了,当功能过于复杂,我们就要封装一个容器来进行存储这个功能

就比如模板要将当前求和放大10倍

    <h1>当前求和为:{{ $store.state.sum }}</h1><h3>放大10倍的和:{{ $store.state.sum * 10 }}</h3>

这里功能开始变得复杂,那么就可以考虑是不是可以封装到计算属性里面呢?computed

  <h3>放大10倍的和:{{ dahe()}}</h3>computed: {dahe() {return this.$store.state.sum * 10}},

但是这里就有一个问题,这个方法就只能自己组件里面使用,不能让组件之间进行共享,所以这里就引入了新的vuex配置项,getters 

一、getters 

// 准备getters——用于将state里面的数据进行加工
const getters = {bigSum(state) {return state.sum * 10}
}// 创建 并 暴露store
export default new Vuex.Store({actions,mutations,state,getters
})

在vuex里面进行创建getters,然后实现你要完成的方法,并且将getters引入store中

那么怎么引入getters的数据到模板中呢?

我将sum修改成1好进行观察

// 准备state——用于存储数据
const state = {sum: 1
}

利用生命周期挂载输出MyCount里面的$store

能够看到我们实现的bigSum函数值为10,那么获取就可以直接在模板中访问我们想要得到的值

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

所以getters就是拿着数据源里面的数据进行加工然后再给你返回加工后的值。由此,state像极了data,而getters像极了computed计算属性

回到MyCounst组件中, 我们发现一遍遍的书写$store.state.……实在是过于麻烦,我们的终极目标就是只写sum、bigSum、school、subject

那有一种办法就是利用计算属性,可以实现:这样就解释了sum并不是函数名,而是一个计算属性

    <h1>当前求和为:{{ sum }}</h1><h3>放大10倍的和:{{ bigSum }}</h3><h3>我在{{ school }},学习{{ subject }}</h3>computed: {sum: function asdhaksdjaslkdjasdkalskdl() {return this.$store.state.sum},school() {return this.$store.state.school},subject() {return this.$store.state.subject},bigSum() {return this.$store.getters.bigSum},},

但是!不出意外的话就要出意外了!你不觉得这些计算属性里面的函数值都很类似吗? 也同样是return this.$store.state……,有没有什么方法可以直接写一个test函数,然后生成return this.$store.state这么一段,让我们直接进行调用呢!!

有的兄弟有的!Vue的设计者也想到了这一点,就给我们设计好了mapState

  本节素材已上传至Gitee:yihaohhh/我爱Vue - Gitee.comhttps://gitee.com/liu-yihao-hhh/i-love---vue/tree/master/26_src_%E6%B1%82%E5%92%8C%E6%A1%88%E4%BE%8B_mapState%E5%92%8CmapGetters

二、 mapState

import { mapState } from 'vuex'

我修改掉函数名, 只是想证明函数名跟配对的属性值是一组,好让mapState工作的时候进行映射能看看清楚是同一组数据在进行映射 

  mounted() {const x = mapState({'he':'sum'})console.log(x)}

由于mapState是要求传入的对象,那么就是key-value进行配对,那么key值永远都是一个字符串,可以用简写形式, 但是value却不行,如果value就写成sum, 他就会去寻找sum这个变量,但是我们的sum是一个属性名啊,也是一个字符串,所以sum要加上引号,让他是一个字符串

  mounted() {const x = mapState({he:'sum', xuexiao:'school', xueke:'subject'})console.log(x)}

 

但是这里引入mapState确保错了!这里就要考es6的基本功怎么样了

由于对象里面是不能直接写对象的,否则就会报错

那么我们要是有个obj2也是对象,怎么添加到obj里面呢?

    let obj2 = { x: 100, y: 200 }let obj = {a: 1,b: 2,...obj2}

写成...obj2就不会报错了,这样就是默认将obj里面的元素合并到obj里面!

所以, 你看清楚mapState在控制台中是一个对象!而computed计算属性也是一个对象,就不能直接放在computed里面 而是要加...mapState才是能够将当前的mapState对象里面的值合并到computed里面!

  computed: {// 借助mapState生成计算属性, 从state中读取数据 (对象写法)...mapState({he:'sum', xuexiao:'school', xueke:'subject'})},

此时的computed计算属性里面就相当于,我写了那么多一长串的代码,页面仍然更新正常,怎么是不是超级方便!

唯一的不一样就是用mapState生成出来的计算属性,又单独在开发者工具里面多开一行,是隶属于计算属性的一栏,告诉开发者是你利用mapState来生成的一堆绑定数据

这里就先回到最初的命名规则

    ...mapState({sum:'sum', school:'school', subject:'subject'}),

那么就一定有人说,啊呀!可以用es6简写办法!

    ...mapState({sum, school:'school', subject:'subject'}),

现在可以看到,当前的sum就会被Vue解析成sum: sum, 仍然会遇到上面那个问题,变成key-value值,上面的sum会被解析成'sum' 但是后面那个sum会被去寻找sum变量,找不到而报错

那么另一种数组写法,就是采用mapState映射的关系告诉Vue,你这个计算属性的名字是叫'sum',是从'sum'这个 state的sum属性中来得到的数据,所以这里的命名就必须要跟state的属性名字一模一样,不能在跟上面he作为计算属性!!!

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

三、 mapGetters

所以下面还有一个从getters里面取到的值也是一样的获取效果

import { mapState, mapGetters } from 'vuex'// 对象写法...mapGetters({bigSum:'bigSum'})//数组写法...mapGetters(['bigSum'])

yihaohhh/我爱Vue - Gitee.comhttps://gitee.com/liu-yihao-hhh/i-love---vue/tree/master/27_src_%E6%B1%82%E5%92%8C%E6%A1%88%E4%BE%8B_mapMutations%E5%92%8CmapActions  本节素材已上传至Gitee:yihaohhh/我爱Vue - Gitee.comhttps://gitee.com/liu-yihao-hhh/i-love---vue/tree/master/27_src_%E6%B1%82%E5%92%8C%E6%A1%88%E4%BE%8B_mapMutations%E5%92%8CmapActions

四、 mapMutations

学懂了上面的计算属性,后面还有两个就好理解了!对于commit提交事件也是这么写,进行引入mapMutations

import { mapState, mapGetters, mapMutations } from 'vuex' methods: {// increment() {//   this.$store.commit('JIA', this.n)// },// decrement() {//   this.$store.commit('JIAN', this.n)// },...mapMutations({increment:'JIA', decrement:'JIAN'}),

但是当我点击+ 却报错了,而'JIA'却别调用了! 

回到vuex里面观察是不是传入值value错误了

// 准备mutations——用于操作数据(state)
const mutations = {JIA(state, value) {console.log(value)console.log('mutations被调用了')state.sum += value},JIAN(state, value) {state.sum -= value}
}

是一个鼠标点击事件,说明就是value传值错误! 

原因就是,原本我们自己写的increment函数里面是自己带this.n的参数进行传入mutations来进行接收,但是我们用mapMutations写后,就没有传入参数给他接收,那么就是默认参数event被传入

那么只要我们在模板里面调用函数的时候传参就欧克啦~

    <button @click="increment(n)">+</button><button @click="decrement(n)">-</button>data() {return {n:1, // 用户当前选择的数字}},methods: {// increment() {//   this.$store.commit('JIA', this.n)// },// decrement() {//   this.$store.commit('JIAN', this.n)// },// 借助mapMutations生成对应的方法, 方法中会调用commit去联系mutations// 对象的写法...mapMutations({increment:'JIA', decrement:'JIAN'}),},

数组写法

    // 数组的写法...mapMutations(['JIA', 'JIAN']),// 同样 模板里面的调用方法得改<button @click="JIA(n)">+</button><button @click="JIAN(n)">-</button>

这里要与vuex里面的mutations里面实现的方法一致

// 准备mutations——用于操作数据(state)
const mutations = {JIA(state, value) {console.log('mutations被调用了')state.sum += value},JIAN(state, value) {state.sum -= value}
}

五、 mapActions

还有最后一步,引入mapActions 

import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'// incrementOdd() {//   this.$store.dispatch('jiaOdd', this.n)// },// incrementWait() {//   this.$store.dispatch('jiaWait', this.n)// }// 对象写法...mapActions({incrementOdd: 'jiaOdd', incrementWait: 'jiaWait'})// 同样是要对调用进行传参<button @click="incrementOdd(n)">当前求和为奇数再加</button><button @click="incrementWait(n)">等一等再加</button>

数组写法

    ...mapActions(['jiaOdd', 'jiaWait'])// 同样对函数名的调用就要修改了, 因为数组写法就会生成同名的函数名和调用属性<button @click="jiaOdd(n)">当前求和为奇数再加</button><button @click="jiaWait(n)">等一等再加</button>

学到这儿来个小总结:四个map方法的使用

  1. mapState方法:用于帮助我们映射state中的数据为计算属性

      computed: {//借助mapState生成计算属性:sum、school、subject(对象写法)...mapState({sum:'sum',school:'school',subject:'subject'}),//借助mapState生成计算属性:sum、school、subject(数组写法)...mapState(['sum','school','subject']),},

  2. mapGetters方法:用于帮助我们映射getters中的数据为计算属性

      computed: {//借助mapGetters生成计算属性:bigSum(对象写法)...mapGetters({bigSum:'bigSum'}),​//借助mapGetters生成计算属性:bigSum(数组写法)...mapGetters(['bigSum'])},

  3. mapActions方法:用于帮助我们生成与actions对话的方法,即:包含$store.dispatch(xxx)的函数

      methods:{//靠mapActions生成:incrementOdd、incrementWait(对象形式)...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'})​//靠mapActions生成:incrementOdd、incrementWait(数组形式)...mapActions(['jiaOdd','jiaWait'])}

  4. mapMutations方法:用于帮助我们生成与mutations对话的方法,即:包含$store.commit(xxx)的函数

      methods:{//靠mapActions生成:increment、decrement(对象形式)...mapMutations({increment:'JIA',decrement:'JIAN'}),//靠mapMutations生成:JIA、JIAN(对象形式)...mapMutations(['JIA','JIAN']),}

备注:mapActions与mapMutations使用时,若需要传递参数需要:在模板中绑定事件时传递好参数,否则参数是事件对象。

总结不易~ 本章节对我有很大的收获, 希望对你也是!!!

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

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

相关文章

html object标签介绍(用于嵌入外部资源通用标签)(已不推荐使用deprecated,建议使用img、video、audio标签)

文章目录 HTML <object> 标签详解基本语法与核心属性关键属性解析1. **data**2. **type**3. **width & height**4. **name** 嵌入不同类型的资源1. **嵌入图像**2. **嵌入音频**3. **嵌入视频**4. **嵌入 PDF** 参数传递与回退内容**参数&#xff08;<param>&a…

警备,TRO风向预警,In-N-Out Burgers维权风暴来袭

本案是TME律所代理的5月首案&#xff0c;传奇连锁快餐品牌In-N-Out Burgers委托维权&#xff01; 案件基本情况&#xff1a; 起诉时间&#xff1a;2025-5-1 案件号&#xff1a;25-cv-04767 品牌&#xff1a;In-N-Out 原告&#xff1a;In-N-Out Burgers 原告律所&#xff…

数据结构算法习题通关:树遍历 / 哈夫曼 / 拓扑 / 哈希 / Dijkstra 全解析

已知一棵二叉树先序遍历和中序遍历分别为 ABDEGCFH 和 DBGEACHF&#xff0c;请画出这个二叉树的逻辑结构并写出后序遍历的序列。 先序遍历&#xff1a;ABDEGCFH 中序遍历&#xff1a;DBGEACHF 先序遍历看出根为A&#xff0c;左子树DBGE&#xff0c;右子树CHF A的左子树 再…

C++GO语言微服务和服务发现

目录 01 03-go-micro简介 02 04-服务发现的简单认识 03 05-consul的安装 04 06-consul常用的命令 05 07-注册服务到consul并验证 06 08-consul健康检查 07 09-consul结合grpc使用-上&#xff08;只实现grpc远程调用&#xff09; 08 10-consul结合grpc使用-中&#xff08…

HDFS 常用基础命令详解——快速上手分布式文件系统

简介&#xff1a; 本文面向刚接触 Hadoop HDFS&#xff08;Hadoop 分布式文件系统&#xff09;的读者&#xff0c;结合 CSDN 博客风格&#xff0c;系统梳理最常用的 HDFS 客户端命令&#xff0c;并配以示例和注意事项&#xff0c;帮助你在开发和运维中快速掌握 HDFS 的文件管理…

VUE CLI - 使用VUE脚手架创建前端项目工程

前言 前端从这里开始&#xff0c;本文将介绍如何使用VUE脚手架创建前端工程项目 1.预准备&#xff08;编辑器和管理器&#xff09; 编辑器&#xff1a;推荐使用Vscode&#xff0c;WebStorm&#xff0c;或者Hbuilder&#xff08;适合刚开始练手使用&#xff09;&#xff0c;个…

make和makefile的使用,以及写一个简单的进度条程序

1.自动化构建-make/makefile 1.1 背景 一个工程文件中的文件不计其数&#xff0c;其按类型、功能、模块放在若干目录中&#xff0c;makefile定义了一系列规则来指定哪些文件需要先编译&#xff0c;哪些文件需要后编译&#xff0c;哪些文件需要重新编译&#xff0c;甚至于过呢…

数据结构中的栈与队列:原理、实现与应用

前言&#xff1a;栈和队列是计算机科学中两种最基础的线性数据结构&#xff0c;它们的独特操作规则和广泛的应用场景使其成为每一位开发者必须掌握的核心知识。本文将通过生活案例、代码实现和实际应用场景&#xff0c;带您深入理解这两种数据结构的精髓。 1.栈&#xff08;Sta…

如何选择自己喜欢的cms

选择内容管理系统cms what is cms1.whatcms.org2.IsItWP.com4.Wappalyzer5.https://builtwith.com/6.https://w3techs.com/7. https://www.netcraft.com/8.onewebtool.com如何在不使用 CMS 检测器的情况下手动检测 CMS 结论 在开始构建自己的数字足迹之前&#xff0c;大多数人会…

SDC命令详解:使用all_outputs命令进行查询

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html all_outputs命令用于创建一个输出端口对象集合&#xff0c;关于设计对象和集合的更详细介绍&#xff0c;可以参考下面的博客。 Synopsys&#xff1a;设计对象https://chenzhang.blog.csdn…

vue 中的ref

vue 中的ref vue 中的ref 1. ​​ref​​ ** 的基本作用** 在 Vue 中&#xff0c;ref 是用来获取 DOM 元素或者组件实例的一种方式。对于 <el-form> 组件&#xff0c;通过 ref 可以获取到该表单组件的实例&#xff0c;进而调用表单组件提供的各种方法和访问其属性。 …

数据库版本控制工具--flyway

一. 什么是Flyway Flyway 是一款开源的数据库迁移工具。它采用简单直观的方式管理数据库变更&#xff0c;通过版本化的迁移脚本确保数据库结构的一致性和可重复性。无论是开发环境、测试环境还是生产环境&#xff0c;Flyway 都能确保数据库变更按照预期顺序执行&#xff0c;避…

C++使用PoDoFo库处理PDF文件

&#x1f4da; PoDoFo 简介 PoDoFo 是一个用 C 编写的自由开源库&#xff0c;专用于 读取、写入和操作 PDF 文件。它适用于需要程序化处理 PDF 文件的应用程序&#xff0c;比如批量生成、修改、合并、提取元数据、绘图等。 &#x1f31f; 核心特点 特性说明&#x1f4c4; P…

论文分享➲ arXiv2025 | TTRL: Test-Time Reinforcement Learning

TTRL: Test-Time Reinforcement Learning TTRL&#xff1a;测试时强化学习 https://github.com/PRIME-RL/TTRL &#x1f4d6;导读&#xff1a;本篇博客有&#x1f9a5;精读版、&#x1f407;速读版及&#x1f914;思考三部分&#xff1b;精读版是全文的翻译&#xff0c;篇幅较…

dify插件接入fastmcp示例

文章目录 1. 使用python完成mcp服务1.1 准备环境&#xff08;python安装fastmcp&#xff09;1.2 mcp服务端示例代码1.3 启动mcp服务端 2. dify接入2.1 安装MCP SSE和 Agent 策略&#xff08;支持 MCP 工具&#xff09; 插件2.2 dify agent插件配置mcp:2.3 mcp服务配置&#xff…

Linux 挖矿木马排查命令清单

Linux 挖矿木马排查命令清单 1. 系统资源使用情况检查 # 查看CPU、内存使用情况 top -c# 检查CPU占用最高的进程 ps aux --sort-%cpu# 查找可疑进程名 ps -ef | grep -i miner\|cpu\|GPU\|xmr# 检查网络连接情况 lsof -i2. 可疑进程和隐藏进程检查 # 检查僵尸进程 ps -ef | …

PyTorch 中如何针对 GPU 和 TPU 使用不同的处理方式

一个简单的矩阵乘法例子来演示在 PyTorch 中如何针对 GPU 和 TPU 使用不同的处理方式。 这个例子会展示核心的区别在于如何获取和指定计算设备&#xff0c;以及&#xff08;对于 TPU&#xff09;可能需要额外的库和同步操作。 示例代码&#xff1a; import torch import tim…

自主shell命令行解释器

目标 能处理普通命令能处理内建命令 实现原理 用下面的时间轴来表示时间发生次序。时间从左向右。shell由标识为sh的方块&#xff0c;它随着时间从左向右移动。 shell从用户读入字符串“ls”。shell建立一个新的进程&#xff0c;然后等待进程中运行ls程序并等待进程结束。 …

如何在sheel中运行Spark

启动hdfs集群&#xff0c;打开hadoop100:9870&#xff0c;在wcinput目录下上传一个包含很多个单词的文本文件。 启动之后在spark-shell中写代码。 // 读取文件&#xff0c;得到RDD val rdd1 sc.textFile("hdfs://hadoop100:8020/wcinput/words.txt") // 将单词进行切…

【入门】数字走向II

描述 输入整数N&#xff0c;输出相应方阵。 输入描述 一个整数N。&#xff08; 0 < n < 10 ) 输出描述 一个方阵&#xff0c;每个数字的场宽为3。 #include <bits/stdc.h> using namespace std; int main() {int n;cin>>n;for(int in;i>1;i--){for(…