草庐IT

vue - Vuex

Heymar-10 2023-03-28 原文

今天内容挺多,因为想的是必须在一天内把这个vuex完成,说实话这里面要记得东西还是蛮多的,主要是分为原生的和简便方法两种都是vue官方定义的,只不过看你要用哪种,vuex感觉要是用熟练了不得了,直接可以把vue起飞了,数据到处用,那种起飞的感觉,曾经体验过,所以这个应该还是可以多练练的。
明天进入vue2中的最后一个内容了,路由,这也是一个一直耳闻但是从没有见过的东西。

一.理解vuex

1.vuex是什么

专门在vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间的通信

我们以前要实现各个组件间通信,是不是全局事件总线,我们以前都是拿来读这个数据然后对他进行操作,其实没有考虑到写去改这个数据,如果要改A里面的数据,那么A就要绑定一个自定义事件,接受别个组件发回来的数据,然后在A里面修改,vuex我个人而言哈还是挺方便的,但却是看起来这张图有点复杂了

vuex来实现,他不属于任何一个组件,就连app都不是,它是插件所以是注册在入口文件的,vuex是实现任意间数据通信的,他还有一个特点,它是共享数据的,也就是你能直接用你能直接改,那我看到的也是你改之后的结果,最主要他没有那么复杂了,都是单线联系,双向绑定

2.求和案例(普通版)

做一个求和的案例

关键点一个是要让我们selection选择的值能够成为后面的加减的基数,所以每一个点击事件函数应该加的的是option里面的值,还有一个点也是这个select框的问题,当我们点击后值变为了字符串类型,这里可以用:单向绑定让他成为数值型,但是也可以把 v-model专用的三个修饰符用起来,一个number、一个trim、一个lazy(失去焦点在获取数据)

3.vuex工作原理图

要搞懂vuex,就必须把这张图记下来

vuex是由三个重要部分组成,actions、mutations、state。我们说要把数据交給vuex进行管理其实就是交给state对象进行存储,它是一个对象,这三个部分其实都是对象,当我们把我们要管理的数据放到state里面后,就把视线看到vc实例这里,我们把数据交给vuex了,但是这个时候我们的vc要开始事件了,这个时候没有数据因为你把数据给到vuex了,想要拿到数据就得遵守它的规则。

先在组件处调用api(dispatch)两个参数,一个是你的函数名和你要传进去的值,这个时候就把函数和值给到actons来了,这里面同样要配置,在actions里面的函数又有两个参数,第一个参数context,迷你版store,发起commit请求,提交到mutations,他的参数state和value,你要对值做什么操作,就可以在这里加工了,然后state里面你保存的值就发生变化了,随后就会重新解析模板,你的值就到页面了。

我们的actions,可能你会觉得有点多余,因为就是一个提交的功能,可以看到它上面有一个api,这是api服务器的意思,如果当我们传进来的值不确定需要ajax拿服务器过来的值,这个时候就要用到actions了,只能在这里发起请求。当然如果你实在没有ajax请求,也没有一些业务逻辑,其实可以省略这一步的,后面也会说。

然后就是devtools,这是vuex的开发者工具。

其实还有一个store的api,他负责管理这三个部分,包括我们的dispatch、commit等api都是他的,所以所有的前提都是要先配置好store

二.vuex核心概念及api

1.搭建vuex开发环境

首先安装并注册,vue2要用vuex3版本,vue3要用vuex4版本

这个时候就要去创建vuex核心内容,vuex,官方推荐的是在src下面创建一个目录store里面放一个index.js这个js文件就是我们的store,并且在里面要定义好我们vuex的核心中的核心,也就是三个过程

这个时候创建好store之后就可以去入口文件导入了,然后每个vc、vm实例上就应该都有一个$store的api了,如果是这样你会发现报错,让你要先use注册再导入store,但是你会发现把import这句放到use下面还是会报错

其实归根结底还是因为脚手架对于import和普通语句的划分,对于import不管你放在多下面,到时候解析都会先把所有import提升到最上面之后,再按顺序去执行每一行代码

所以这里应该这么做,将我们的use注册放到store这个js文件里面,同时导入vue,再去入口文件写上我们的store

2.求和案例(vuex版)

一定要结合者那张图去理解

给我们的数据丢进state里面

  • 然后可以开始我们那张vuex流程图的步骤来了,首先是vc这里触发,调用dispatch这个api将我们的函数和要传进去的参数值发进去

  • 这边既然传进去了,那我们action这个对象里面也要有这个函数才行,所以要去定义在 action这个对象里面定义的函数,会受到两个值,第一个值相当于迷你版store里面有commit、dispatch等方法,第二个值就是我们传进来参数,直接commit给mutation去处理,这里我们给mutation的函数可以跟这里的一样,但是为了做一个区分一般改成全大写

  • 在我们mutation处理对象这里也会收到两个参数,第一个是我们state对象,第二个是我们传进来的值,所以要怎么处理,操作的逻辑一般都写在这里了

  • 然后就是我们要怎么在页面中呈现出来这个值,vc身上已经有一个$store了,在这个store里面有一个state,里面有我们的x的值

  • 剩下的其他逻辑同理即可

  • 完善点一

    之前说过可以把一些业务逻辑或者ajax请求放在action里面,所以这里奇数加和定时器加可以转移位置

  • 完善点二

    还说过如果没有业务逻辑或者ajax请求,dispatch进入action这一步稍显多余,可以直接进入mutations,直接在dispatch这里commit

3.vuex开发者工具

需要注意的是之前一直用的最新版本6.14,这个版本属实不知道怎么用,可能只拿来支持vue3.0的,其实在谷歌商店下载对应的5.x版本就可以了

base state使我们初始化的数据放在state里面的值,然后点一次就会执行一次mutations里面的操作,所以看刚才的原理图,devtools也是检测的mutations,然后我们mutations有三个按钮,从左往右依次为,第一个是将他和之前的一起融合计算最终值就是我们的base state基础值,第二个是删除这次操作,数据会回到这次之前的状态,第三个是直接回到这次的时候数据也是这时候的,但是不会被删除下面的这些节点

上面三个是全部算为基础值,第二个是清空,第三个是不检测了

在最右边有导出和导入,当你想要把你的操作给别人看看问题出现在哪里的时候,你可以到处,直接在粘贴板了,然后他可以点击导入,直接复制进来

4.context

我们可以看到那个迷你版store有这么多方法分别都是干嘛的

第一个commit就不用说了继续往下走的,第二个dispatch是为了怕我们在这里的业务逻辑过多写不完,为了能够灵活处理,可以在这dispatch,然后就在actions再写一个你dispatch的函数

然后是我们的state这个对象,有些时候这里写逻辑需要用到存进去的这个值,其实在这里写mutations要做的的事情确实可以,但是最好按照标准来,因为你如果在这里写,开发者工具就失效了

5.getters配置项

store全新配置项

当我们想要对数据作进一步的修改同时呈现在另一个地方,要怎么做?

你可以直接写在vue语法里面,但是写在这里面的话,如果你要一大堆的算法那就不符合风格了这里

你也可以通过计算属性来写,但是计算属性算出来得值只有这个组件能用

所以这个时候就需要getters了

定义在store里面,定义完了还要通过store暴露出去,一个对象里面写函数接受一个参数state,跟computed一样返回值就是函数的值

取值通过store下面的getters对象里面bigNum函数得到

6.mapState和mapGetters

6.1mapstate

像我们原来这样要写一大版东西放进vue语法里面

不太符合vue的风格模板,想要精简也可以,通过计算属性

  • 对象写法:很明显这是为了引出那个东西,这样写也太繁琐了,vue确实给我们提供了能够把操作化简的东西,一个函数里面传一个对象以键值对的方式给我们要取的名字和我们数据在state中的名字进行组合,不同再写前面的路径了,因为本来就是在state里面去找,它自动生成的就是一个个函数,所以一般是放在计算属性里面,而且采用es6语法把对象包着的这些函数打开

    注意导入的时候怎么导入的

    我们对象其实属性和值都应该是加引号的,只是有些时候属性可以省略,值如果是这里可以找到这个变量就可以不加引号

  • 数组写法:当我们属性和值一样的时候,简写形式是针对于后面是一个变量不是字符串的时候,这里不能用简写,但是如果真的属性和值是一样的那么这里可以采取数组写法来简写

6.2mapGetters

同理

7.mapActions和mapMutations

7.1mapMutations

可以让我们没有一些逻辑不经过actions,直接commit这部分的代码可以简便一点

导入后,用法跟前面一样,只不过是写在methods里面

然后要注意一下这里的参数怎么传进来,他其实就是帮我创建了像上面addition这样的函数,只不过我们自己写,是可以写参数的,而他这种方法,你没有写参数,我们都知道事件函数,不写参数默认就是e这个事件对象,

所以在我们事件函数这里插入参数即可

7.2mapActions

这个就是帮我们简化进入actions这一步,简化dispatch这一步

8.多组件共享数据

先来一个组件能实现点击添加按钮添加在数组里面

当我们一点击添加就开始走vuex的流程,这里也没有其他的逻辑,所以可以直接commit

然后我要实现数据共享,在我们求和这个组件直接展示

同时在人员组件展示求和的结果

9.vuex模块化+namespace

写完这两个案例下来可以看到我们的store这个js文件已经很混乱了,这还只是两个简单的案例,差不多已经分不清谁是谁干嘛的了

所以说我们最好也给 store也模块化一下,分个类让我们能够更清晰一点,就目前来说,我们做了一个求和案例,一个人员管理案例,所以大体上可以分为两类,像这样创建两个对象,每一个模块都有自己的state、mutations、actions等

然后导出的时候你可以自己取名,也可以使用简化模式

  • computed 经过我们这样一模块化,那么我们的state里面就没有刚才看到的那么直接的数据了,现在的$store的state里面就只有这两个对象了,而对象里面才是state里面的数据,所以我们要这样使用map了,这里为什么能简写,因为state里面就是这个我们取的名字也是这个

同时还要将我们标签上的改过来

那有没有简便方法,因为毕竟这么写,不太符合vue的规则,说了vue语法里面要简洁,是有的。

将我们这个对象名放在前面来,后面用我们原来的形式写,这样就可以在标签上写的时候直接写我们在store文件里面定义的名字

但是这样写必须有个前提,就是我们store文件模块化里面必须添加一个配置项

  • methods,我们的actions和mutations这两个节点同时也要改

以上都是简便方法模块化怎么来写,下面说一下原来的纯手写怎么来导入我们的模块化

  • 首先是获取数据,因为state下面不是我们直接的数据了,所以在前面添加模块的名字

  • 然后要去修改值,在以前的基础上

  • getters的修改

    但是getters是对象,对象.的形式不允许出线/符号

  • 加入要经过actions,有业务逻辑去修改值

  • 模块再模块

    这才是真正的es6模块化,分出来作为js文件,导出,然后再index里面导入

  • 最后一条线,就是我们在actions怎么来发起ajax请求

有关vue - Vuex的更多相关文章

  1. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  2. (附源码)vue3.0+.NET6实现聊天室(实时聊天SignalR) - 2

    参考文章搭建文章gitte源码在线体验可以注册两个号来测试演示图:一.整体介绍  介绍SignalR一种通讯模型Hub(中心模型,或者叫集线器模型),调用这个模型写好的方法,去发送消息。  内容有:    ①:Hub模型的方法介绍    ②:服务器端代码介绍    ③:前端vue3安装并调用后端方法    ④:聊天室样例整体流程:1、进入网站->调用连接SignalR的方法2、与好友发送消息->调用SignalR的自定义方法 前端通过,signalR内置方法.invoke()  去请求接口3、监听接受方法(渲染消息)通过new signalR.HubConnectionBuilder().on

  3. vue 实现内容超出两行显示展开更多功能,可依据需求自定义任意行数! - 2

    平时开发中我们经常会遇到这样的需求,在一个不限高度的盒子中会有很多内容,如果全部显示用户体验会非常不好,所以可以先折叠起来,当内容达到一定高度时,显示展开更多按钮,点击即可显示全部内容,先来看看效果图: 这样做用户体验瞬间得到提升,接下来看看具体细节。0">主要操作在内容这里{{item.username}},……展开更多样式大家可依据自己项目需求进行设计,这里就不贴了,主要说几个关键的。1、在data中定义三个属性isShowMore:false, //控制展开更多的显示与隐藏textHeight:null, //框中内容的高度status:false, //内容状态是否打开2.计算内容是否

  4. vue3.0 + vite2.0+如何兼容低版本浏览器 - 2

    这里写自定义目录标题一、问题二、解决三、解决方案四、打包预览一、问题在使用vue3.2和vite2开发一个移动端或者钉钉端H5微服务iosapp内置浏览器打开没问题安卓app内置浏览器打开空白页面vconsole打印出现报错globalthisundefind二、解决内置浏览器版本比较低打印出来是63vue3代码不兼容低版本浏览器三、解决方案步骤一:vite.config.ts里build.target配置项指定构建目标为es2015或者步骤二:安装@vitejs/plugin-legacy安装完报错也还在指定版本可以解决“@vitejs/plugin-legacy”:“1.8.0”,步骤三:

  5. Vue3的新特性 - 2

    Vue3的新特性包括:CompositionAPI:一种新的API风格,可将有关组件功能的代码逻辑封装在单独的函数中,从而更好地管理和重用代码。Teleport:可以让组件在DOM层次结构中的任何位置渲染。Suspense:一种新的异步渲染模式,可以优化应用程序的性能。更快的渲染速度:Vue3使用了新的虚拟DOM算法,并且对渲染过程进行了优化,因此在渲染大型应用时性能更高。更小的包大小:Vue3的打包大小比Vue2更小,因为它不再需要依赖像vue-template-compiler这样的工具。其他改进:Vue3还具有其他一些改进,例如更好的TypeScript支持、更好的错误提示和更好的调试工

  6. vue2+element-ui,el-aside侧边栏容器收缩与展开 - 2

    一、概览实现效果如下:二、项目环境1、nodejs版本node-vv16.16.02、npm版本npm-vnpmWARNconfigglobal`--global`,`--local`aredeprecated.Use`--location=global`instead.8.15.03、vue脚手架版本vue-V@vue/cli5.0.8三、创建vue项目1、创建名为vuetest的项目vuecreatevuetest选择Default([Vue2]babel,eslint)  2、切换到项目目录,启动项目cdvuetestnpmrunserve 3、使用浏览器预览 http://localh

  7. Vue学习笔记:Vue element-ui中table组件的使用----接入后端数据 - 2

    记个笔记以免遗忘,建议还是查看Element-UI提供的官方文档学习,自己摸索比较难受官方文档:Element-UI组件TableElement-UI官网提供了许多Table格式,这里以一个带有筛选器的表格为例表格的官网显示效果:直接将官方提供的示例代码贴入.vue文件中即可使用显示的数据是通过data()方法提供的假数据。方法见下:data(){return{tableData:[{date:'2016-05-02',name:'王小虎',address:'上海市普陀区金沙江路1518弄'},{date:'2016-05-04',name:'王小虎',address:'上海市普陀区金沙江路1

  8. ruoyi-vue 新建模块--若依前后端分离系统代码生成。 - 2

    目录:1.在数据库中创建表2.使用代码生成功能,生成基础代码2.1修改代码生成器中配置文件generator.yml2.2使用系统工具代码生成3.新建子模块,迁移代码3.1创建grayskyax-assetsmanagement模块3.2在RuoYi整个项目下的`pom.xml`中引入刚刚新建的模块:3.3在ruoyi-admin模块的pom.xml中引入新建的模块3.4在新建的assetsManagement模块中引入ruoyi-common模块3.5将之前解压后的文件放如项目的对应目录下;3.6在数据库中执行生成的sql脚本3.7配置扫描路径application.yml,applicat

  9. 项目部署——Vue项目部署到云服务器(linux) - 2

    因为期末了,要检查web大作业,虽然没有要求,但我想把项目部署一下,以免每次都要打开运行了,部署过踩了许多坑,这里总结一一下这次部署的流程吧。项目我个人进行前后端分离的全栈开发,有后台,后台部署的过程由于篇幅原因将在下一篇中讲解准备工作准备一台虚拟机或者云服务器(linux系统)首先,由于真实的项目基本上都部署在linux系统上,因此为了贴近真实,我们需要准备一台带有linux系统的虚拟机或者云服务器,由于虚拟机不能在自己的电脑关机了以后继续运行,因此这里推荐云服务器,目前用过阿里云,腾讯云两款云服务器部署项目,操作基本上都十分简单。新用户可以在腾讯云和阿里云平台都有两周的免费云服务器可以领取

  10. javascript - vue.js中v-show的回调 - 2

    有没有使用vue.js的on-shown和on-show的回调方法?我在div元素上使用v-show="my-condition"。但里面有一些charts.js图表,除非可见,否则无法呈现。任何人都知道如何仅在父级可见时才渲染chart.js?它们位于可选择的选项卡内,因此它可能会触发多次。我正在使用Vue.js和vue-strap。 最佳答案 查看thisanswer-在类似情况下,使用nextTick()对我有用。简而言之:newVue({...data:{myCondition:false},watch:{myConditi

随机推荐