【vue2第二十章】vuex使用 (state,mutations,actions,getters)

vuex是什么?

Vuex是一个用于Vue.js应用程序的状态管理模式。它允许您在应用程序中管理共享状态,并以可预测的方式进行状态更新。Vuex集成了Vue的响应式系统,使得状态的变化能够自动地更新视图。使用Vuex,您可以将应用程序的状态集中存储在一个地方,而不是分散在各个组件中。这样可以方便地跟踪、调试和管理应用程序中的状态,并且能够更好地处理复杂的应用程序逻辑和状态间的依赖关系。总之,Vuex可以帮助您更好地组织和管理Vue.js应用程序的状态。
用大白话来说就是,vuex是一个插件,可以帮助我们管理vue的通用数据(多组件共享数据)

使用vuex就是很多个组件都可以使用一份数据,也可以对这同一份数据进行维护,不需要再使用组件之间的通讯方式,每个组件直接访问vuex里面的数据。如下图:
在这里插入图片描述

构建vuex(多组件数据共享)环境。

在创建项目时没有选择vuex时,需要手动安装,如果已经勾选则可以直接使用。接下来是手动安装步骤。
在这里插入图片描述
主要分为四步(这里使用的时npm):

  1. 在项目路径下打开终端输入 npm install vuex@3.6.2 --save在这里插入图片描述
  2. 在src目录下创建文件夹store,在其中创建index.js文件。

在这里插入图片描述

  1. 在index.js文件中引入vuex,创建仓库后导出。
import Vue from "vue";
import Vuex from "vuex";Vue.use(Vuex);const store =new Vuex.Store();
export default store;
  1. 在main.js文件中直接导入,然后挂载
import Vue from 'vue'
import App from './App.vue'
import store from "@/store/index"Vue.config.productionTip = falsenew Vue({render: h => h(App),store
}).$mount('#app')
vuex如何提供数据和访问数据(state)。
vuex提供数据 核心概念state

在这里插入图片描述
在创建仓库时,添加state对象,在state对象中添加数据。如下:

import Vue from "vue";
import Vuex from "vuex";Vue.use(Vuex);const store =new Vuex.Store({state:{count:0,title:'大标题'}
});export default store;
vuex访问数据(直接访问 和 使用mapState辅助函数)

访问数据也就是如何使用数据。
在这里插入图片描述
在标签中直接使用模板语法{{ $store.state.数据名称}}即可访问数据。
在js代码中,使用this.$store.state.count访问数据。

<template><div id="app"><div>{{ $store.state.title }}</div><p>{{ $store.state.count }}</p>    </div>
</template><script>
export default {name: 'App',created(){console.log(this.$store.state.count)}
}
</script>

以上方法每次使用数据都需要写一大串,所以vuex也提供了简便方法,通过辅助函数。
在这里插入图片描述
使用展开运算符的原因是,可以继续扩展组件需要的计算属性,不会因为一个mapState就把整个计算属性占满导致无法使用组件计算数据。

<template><div><!--3. 最后直接通过属性名使用数据 -->	<p>{{ title }}</p><p>{{ count }}</p><button @click="changecount">新增</button></div>
</template><script>
//1.导入mapState辅助函数
import { mapState } from 'vuex';export default {computed:{//2.使用数组方式引入state,使用展开运算符自动映射到计算属性中...mapState(['count','title'])}
}
</script>
vuex修改数据

修改数据很多人就会想到,既然可以直接拿,那么肯定可以直接改吧,就如下代码,直接写一个方法,直接在组件中修改vuex中的数据。 但是这样写是不规范的。

<template><div id="app"><div>{{ $store.state.title }}</div><p>{{ $store.state.count }}</p><button @click="changecount">新增</button></div>
</template><script>
export default {name: 'App',methods:{changecount(){//直接在组件中对vuex中的值进行修改,错误写法。this.$store.state.count++}}
}
</script>

在这里插入图片描述
所以vuex提供了一个严格模式,只要在组件中进行修改vuex中的数据就会报错。

import Vue from "vue";
import Vuex from "vuex";Vue.use(Vuex);const store =new Vuex.Store({//开启严格模式。strict:true,state:{count:0,title:'大标题'}
});
export default store;
核心概念mutations

那么不可以直接修改,vuex肯定是提供了可以修改的方法,就是mutations。
在这里插入图片描述
首先在仓库的index.js文件中新增一个mutations对象

import Vue from "vue";
import Vuex from "vuex";Vue.use(Vuex);const store =new Vuex.Store({strict:true,state:{count:0,title:'大标题'},mutations:{//修改数据的逻辑countadd(state,obj){console.log(obj)state.count = state.count + obj.num}}
});export default store;

在组件中使用this.$store.commit('mutations中的方法名',参数)其中参数可以是对象,数据,基本数据类型等,但是只可以是一个,不可以传多个参数。

<template><div><p>{{ title }}</p><p>{{ count }}</p><button @click="changecount(1)">加1</button><button @click="changecount(2)">加2</button></div>
</template><script>
import { mapState } from 'vuex';export default {computed:{...mapState(['count','title'])},methods:{changecount(n){this.$store.commit('countadd',{num:n,text:"哈哈哈"})}}
}
</script>

成功修改效果:
在这里插入图片描述
其中mutations也有对应的辅助函数mapMutations
在这里插入图片描述
其中

  methods:{changecount(num){this.$store.commit('countadd',num)}}

methods:{...mapMutations(['countadd'])}

是对等的。

使用mapMutations需要先导入mapMutations。
后续则可直接通过映射的方法名来调用。

<template><div><p>{{ title }}</p><p>{{ count }}</p><!-- 直接使用映射的方法名来调用 --><button @click="countadd(1)">加1</button><button @click="countadd(2)">加2</button></div>
</template><script>
//导入mapMutations
import { mapState,mapMutations } from 'vuex';export default {computed:{...mapState(['count','title'])},methods:{//映射方法 参数为数组,数组中的字符串为需要映射的方法名。...mapMutations(['countadd'])}
}
</script>

核心概念actions

actions使用来处理一部操作的,为什么不使用mutations处理,因为mutations是同步的,因为mutations需要保准数据的精确性,所以使用actions来进行异步操作。
在这里插入图片描述
组件代码(使用actions时需要使用 this.$store.dispatch('方法名',参数)来提交数据):

<template><div><p>{{ title }}</p><p>{{ count }}</p><button @click="changecount(1)">加1</button><button @click="changecount(2)">加2</button><button @click="actionschangecount(1)">一秒钟后加1</button><button @click="actionschangecount(2)">一秒钟后加2</button></div>
</template><script>
import { mapState } from 'vuex';export default {computed:{...mapState(['count','title'])},methods:{changecount(num){this.$store.commit('actionscountadd',num)},actionschangecount(num){//需要使用dispatch来提交数据this.$store.dispatch('actionscountadd',num)}}
}
</script>

index.js新增actions对象新增代码逻辑,这里是使用了一个定时器来模拟发送了请求,在正式使用时就可以改为调用后台接口:

import Vue from "vue";
import Vuex from "vuex";Vue.use(Vuex);const store =new Vuex.Store({strict:true,state:{count:0,title:'大标题'},mutations:{countadd(state,num){state.count = state.count + num}},//新增actions对象actions:{actionscountadd(context,num){//在正式使用actions这里就可以改为调用后台接口获取数据setTimeout(()=>{context.commit ('countadd',num)},1000)}}
});export default store;

辅助函数mapActions和mapMutations同理。
在这里插入图片描述
首先需要导入mapActionsimport { mapActions } from 'vuex';
再通过...mapActions(['actionscountadd'])映射方法到methods,
最后直接调用。

<template><div><p>{{ title }}</p><p>{{ count }}</p><button @click="changecount(1)">加1</button><button @click="changecount(2)">加2</button><button @click="actionscountadd(1)">一秒钟后加1</button><button @click="actionscountadd(2)">一秒钟后加2</button></div>
</template><script>
//导入mapActions 
import { mapState,mapActions } from 'vuex';export default {computed:{...mapState(['count','title'])},methods:{//使用mapActions映射需要使用的方法...mapActions(['actionscountadd']),changecount(num){this.$store.commit('countadd',num)}}
}
</script>
核心概念getters

除了state之外,有时我们还需要从state中派生出一些状态,这些状态是依赖state的,此时会用到getters,其实getters就类似于计算属性,而state就类似于data数据,getters需要从已知的state状态中计算出新的getters属性。
在这里插入图片描述
比如以下代码我需要把state中的list中的数字为奇数的过滤掉。只要偶数:

import Vue from "vue";
import Vuex from "vuex";Vue.use(Vuex);const store =new Vuex.Store({strict:true,state:{count:0,title:'大标题',list:[1,2,3,4,5,6,7,8,9,10]},//新增getters对象getters:{filterList(state){//需要返回一个数据return state.list.filter(item => item % 2 == 0)}}
});
export default store;

通过import { mapState,mapGetters } from 'vuex'; 引入mapGetters ,使用filterList属性。

也可以直接通过模板语法{{ $store.getters.filterList }}使用getters属性

<template><div>{{ $store.getters.filterList }}{{ filterList }}</div>
</template><script>
import { mapState,mapGetters } from 'vuex';export default {computed:{...mapState(['count','title']),...mapGetters(['filterList'])}
}
</script>

效果图:
在这里插入图片描述

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

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

相关文章

【论文阅读 07】Anomaly region detection and localization in metal surface inspection

比较老的一篇论文&#xff0c;金属表面检测中的异常区域检测与定位 总结&#xff1a;提出了一个找模板图的方法&#xff0c;使用SIFT做特征提取&#xff0c;姿态估计看差异有哪些&#xff0c;Hough聚类做描述符筛选&#xff0c;仿射变换可视化匹配图之间的关系&#xf…

如何使用ArcGIS Pro自动矢量化道路

对于已经制作好的电子地图&#xff0c;我们可以通过像素识别的方式将其中的要素提取出来&#xff0c;比如本教程要讲到的道路数据&#xff0c;这里为大家介绍一下在ArcGIS Pro中如何自动矢量化道路&#xff0c;希望能对你有所帮助。 栅格计算 在工具箱中点击“Spatial Analys…

【AIGC】Llama2-7B-Chat模型微调

环境 微调框架&#xff1a;LLaMA-Efficient-Tuning 训练机器&#xff1a;4*RTX3090TI (24G显存) python环境&#xff1a;python3.8, 安装requirements.txt依赖包 一、Lora微调 1、准备数据集 2、训练及测试 1&#xff09;创建模型输出目录 mkdir -p models/llama2_7b_chat…

unity gb28181 rtsp 视频孪生图像拉流和矫正插件(一)

目的是为了视频孪生&#xff0c;将视频放到三维里面&#xff0c;如果使用自己写的插件&#xff0c;有更好的灵活性&#xff0c;同时断线重连等等都更好控制了。 1、矫正算法和硬件解码 最好使用opencv制作&#xff0c;可以使用opencv的cuda加速&#xff0c;opencv的编译&…

面试题:RocketMQ 如何保证消息不丢失,如何保证消息不被重复消费?

文章目录 1、消息整体处理过程Producer发送消息阶段手段一&#xff1a;提供SYNC的发送消息方式&#xff0c;等待broker处理结果。手段二&#xff1a;发送消息如果失败或者超时&#xff0c;则重新发送。手段三&#xff1a;broker提供多master模式&#xff0c;即使某台broker宕机…

聚观早报 | 杭州亚运开幕科技感拉满;腾讯官宣启动「青云计划」

【聚观365】9月25日消息 杭州亚运开幕科技感拉满 腾讯官宣启动「青云计划」 FF任命新全球CEO 比亚迪夺得多国销冠 iPhone 15/15 Pro销售低于预期 杭州亚运开幕科技感拉满 杭州第19届亚洲运动会开幕式23日晚在杭州奥体中心主体育馆举行&#xff0c;这届开幕式可谓科技感拉…

基于Yolov8的野外烟雾检测(2):多维协作注意模块MCA,效果秒杀ECA、SRM、CBAM等 | 2023.9最新发布

目录 1.Yolov8介绍 2.野外火灾烟雾数据集介绍 3.MCA介绍 4.训练结果分析 5.系列篇 1.Yolov8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的&#xff08;SOTA&#xff09;模型&#xff0c;它建立在先前…

【Vue】vue-cli一站式搭建SPA项目

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Vue快速入门》。&#x1f3af;&#x1f3af; &…

Python:获取当前目录下所有文件夹名称及文件夹下所有文件名称

获取当前目录下所有文件夹名称 def get_group_list(folder_path):group_list []for root, dirs, files in os.walk(folder_path):for dir in dirs:group_list.append(dir)return group_list获取文件夹下所有文件名称 def get_file_list(folder_path, group_name):file_list …

[Linux入门]---进程的概念

文章目录 1.进程的概念①描述进程-PCB②task_struct-PCB的一种③task_ struct内容分类 2.查看进程3.通过系统调用获取进程表示符4.通过系统调用创建进程---fork初识 1.进程的概念 在我们的电脑开机的时候&#xff0c;操作系统会被加载到内存中&#xff0c;点击多个应用进行时&a…

机器学习第十四课--神经网络

总结起来&#xff0c;对于深度学习的发展跟以下几点是离不开的: 大量的数据(大数据)计算资源(如GPU)训练方法(如预训练) 很多时候&#xff0c;我们也可以认为真正让深度学习爆发起来的是数据和算力&#xff0c;这并不是没道理的。 由于神经网络是深度学习的基础&#xff0c;学…

基于SSM的高校图书馆个性化服务的设计与实现(有报告)。Javaee项目。

演示视频&#xff1a; 基于SSM的高校图书馆个性化服务的设计与实现&#xff08;有报告&#xff09;。Javaee项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过S…

前端JavaScript中的 == 和 ===区别,以及他们的应用场景,快来看看吧,积累一点知识。

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 一、等于操作符 二、全等操作符 三、区别 小结 一、等于操作符 等于操作符用两个等于号&#xff08; &am…

GaussDB数据库SQL系列-定义重载函数

目录 一、前言 二、函数重载的定义 三、GaussDB创建自定义函数的事项说明 四、GaussDB数据库中的自定义函数示例 示例一&#xff1a;创建package属性重载函数&#xff0c;根据不同的SQL条件获取生成视图 示例二&#xff1a;创建package属性重载函数&#xff0c;根据不同的…

SpringMVC+入门案例

一、入门案例 1.依赖导入 <!--1. 导入SpringMVC与servlet的坐标--> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scop…

uni-app:实现元素中实现竖直居中

效果展示 前&#xff1a; 后&#xff1a; 未实现前代码 <template><view class"container"><view class"centered-element">我是要被居中的元素</view></view> </template><script>export default {data() {r…

3D目标检测实战 | 图解KITTI数据集与数据格式

目录 1 数据集简介2 传感器坐标系3 数据集下载与组织4 数据内容说明4.1 矫正文件calib4.2 图像文件image4.3 点云文件velodyne4.4 标签文件label4.5 平面文件plane 1 数据集简介 KITTI数据集是一个广泛应用于自动驾驶和计算机视觉领域的公开数据集。该数据集由德国卡尔斯鲁厄理…

Elasticsearch(Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合)

Elasticsearch&#xff08;三&#xff09;——Es搜索&#xff08;简单使用、全文查询、复合查询&#xff09;、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合 一、Es搜索 这里的 Es 数据博主自己上网找的&#xff0c;为了练习 Es 搜索。 1、Elasticsearch 搜索入门 …

6、SpringBoot_项目的打包与运行

七、SpringBoot项目的打包与运行 1.目前项目怎么运行的 通过浏览器访问idea 将jar部署到服务器 2.maven 打包项目 命令 mvn package使用命令后会得到如下的jar 3.程序运行 命令 java -jar 项目.jar启动如下 4.springboot打包需要插件 插件 <plugin><group…

【AI视野·今日Robot 机器人论文速览 第三十六期】Tue, 19 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Tue, 19 Sep 2023 (showing first 100 of 112 entries) Totally 112 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;In-Hand Object Rotation, RotateIt 提出了一种基于视觉与触觉的物体旋转朝向的方法…