5分钟让你掌握Vuex,深入浅出

2022-12-25 0 921

https://www.cnblogs.com/maoqian/p/15428820.html

一、甚么是Vuex?

基本概念:Vuex 是两个专为 Vue.js 应用领域软件开发的状况区域化。它选用集中式repeats应用领域的大部份组件的状况,并以适当的准则确保状况以一类可预估的形式发生改变。

单纯点而言(说人话),是同时实现任一组件中通讯,并能检验统计数据的变动。

二、Vuex基本原理

Vuex是集中于MVC商业模式中的Model层,明确规定大部份的统计数据操作形式要透过action – mutation – state 的业务流程来展开,再紧密结合Vue的统计数据快照v-moder等单向存取优点来同时实现网页的展现预览。

上面看两张图来介绍各个环节。

5分钟让你掌握Vuex,深入浅出

简述主要就形式详细情况:

Vue Components:Vue组件。展现网页,负责管理转交使用者操作形式等可视化犯罪行为,继续执行dispatch形式促发相关联action展开澄清。dispatch:操作形式犯罪行为促发形式。是惟一能继续执行action的形式。actions:操作形式犯罪行为处置组件。处置Vue Components转交到的大部份可视化犯罪行为。包涵并行/触发器操作形式,全力支持数个撞名形式,依照注册登记的次序依序促发。向前台API允诺的操作形式就在那个模块中展开,主要就包括促发其它action和递交mutation的操作形式。该组件提供更多了Promise的PCB,以全力支持action的拉艾促发。commit:状况改变递交操作形式形式。对mutation展开递交,是惟一能继续执行mutation的形式。mutations:状况改变操作形式形式。是Vuex修改state的惟一推荐形式,其它修改形式在严格商业模式下将会报错。该形式只能展开并行操作形式,且形式名只能全局惟一。操作形式之中会有一些hook暴露出来,以展开state的监控等。state:网页状况管理容器对象。集中存储Vue components中data对象的零散统计数据,全局惟一,以展开统一的状况管理。网页显示所需的统计数据从该对象中展开读取,利用Vue的细粒度统计数据响应机制来展开高效的状况预览。

总的一句话详述是:

Vue组件转交可视化犯罪行为,调用dispatch形式促发action相关处置,若网页状况需要改变,则调用commit方

三、Vuex的使用

1.安装

npm install vuex –save

2.新建两个文件夹store,创建inde.js

随便叫啥,随便建不建立文件夹。为了规范。

5分钟让你掌握Vuex,深入浅出
import Vue from vue import Vuex from vuex Vue.use(Vuex) //准备actions—用于响应组件中的动作 const actions={ } //准备mutations—用于操作形式统计数据(state) const mutations={ } //准备state—相当于data,用于存储统计数据 const state={ } //实例化创建并导出store export default new Vuex.Store({ namespaced: true,//解决组件命名冲突actions, mutations, state, })

注意:

我们在这一步创建index.js文件的时候导入并引用Vuex,因为我们要实例化Vuex对象。如果在main引入,会导致在main.js导入store的时候报错。

5分钟让你掌握Vuex,深入浅出

3.在main.js中引入上一步的index.js,并在实例化 Vue对象时加入 store 对象 :

import store from ./store/index //引入写好的store ….. new Vue({ el: #app, router, store,//使用storetemplate: , components: { App } })

ok,环境搭好,开始操作形式。

4.单纯使用:

先来一点单纯的存放统计数据,取出查看。在一系列操作形式之后我们的VM(View Model)和VC(View component)身上都已经都有store那个统计数据源对象。所以我们能从store身上使用this.$store.state.xxx

在index.js中准备统计数据

const state={ name:浪漫主义码农, age:18, } <template> <div> 我放在store中的统计数据是 {{this.$store.state.name}}, {{this.$store.state.age}} </div> </template>
5分钟让你掌握Vuex,深入浅出

5.mutation、anction

在知道每两个vm和vc身上都有store就能好好操作形式了。

mutation–更改store中状况的惟一形式

根据上面的基本原理图,我们能知道vuex中明确规定只能透过递交mutation的形式去更改store中的状况,主要就包括action中的操作形式,也是透过递交mutation去修改。另外一点是vuex中明确规定mutation中不能包涵触发器操作形式

我们来修改上面的name、age属性。

const mutations = { modify_age(state) {//不带参数修改age属性,state是默认的参数state.name =“张三”; state.age = 20; }, modify_age2(state,payload) {//带参数修改,payload是传入的对象,官网叫载荷(payload) state.name=payload.name; state.age=payload.age; } }

在组件中,我们要使用this.$store.commit(xxx(形式名), 参数;

参数能是对象也能是单一属性

<template> <div>我放在store中的统计数据是 {{ this.$store.state.name }}, {{ this.$store.state.age }}<button @click=“setDefault”>不带参修改</button> <button @click=“setparameter”>带参修改</button> </div> </template> <script> export default { methods: { setDefault() { this.$store.commit(“modify_age”); }, setparameter() { this.$store.commit(“modify_age2”,{name:“王五”,age:100});//载荷形式,传入能使对象或者单个属性 // this.$store.commit({//对象形式,传入能使对象或者单个属性 // type: “modify_age2”, // name: “王五”, // age: 100, // }); }); }, }, }; </script>
5分钟让你掌握Vuex,深入浅出

anction–并行/触发器更改状况

Action 类似于 mutation,不同在于:

Action 递交的是 mutation,而不是直接变更状况。Action 能包涵任一触发器操作形式。

前台API允诺在那个组件展开允诺。大部份的操作形式最后都要到达mutation展开操作形式,更改state的状况。

还是上面两个例子,触发器修改state的属性

先上代码

const actions = { asy_modify (context) {//无参 setTimeout(() => {//触发器操作形式context.commit(“modify_age”) }, 2000); }, asy_modify2 (context,plyload) {//有参 setTimeout(() => { context.commit(“modify_age2”,plyload); }, 2000); } } constmutations = { modify_age(state) {//不带参数修改age属性,state是默认的参数 state.name = “张三”; state.age = 20; }, modify_age2(state,payload) {//带参数修改,payload是传入的对象,官网叫载荷(payload)state.name=payload.name; state.age=payload.age; } }const state = { name: 浪漫主义码农, age: 18, }

在组件中使用this.$store.dispatch(xxx)

<template> <div>我放在store中的统计数据是 {{ this.$store.state.name }}, {{ this.$store.state.age }}<button @click=“setDefault”>不带参修改</button> <button @click=“setparameter”>带参修改</button> </div> </template> <script> export default { methods: { setDefault() { this.$store.dispatch(“asy_modify”); }, setparameter() { this.$store.dispatch(“asy_modify2”,{name:“王五”,age:100});//载荷形式,传入能使对象或者单个属性 // this.$store.dispatch({//对象形式,传入能使对象或者单个属性 // type: “asy_modify2”, // name: “王五”, // age: 100, // }); }, }, }; </script>

注意观察时间,2s后变动。

5分钟让你掌握Vuex,深入浅出

分析一波:

Action 里面的函数接受两个与 store 实例具有相同形式和属性的 context 对象,因此你能调用 context.commit递交两个 mutation,或者透过context.statecontext.gettersaction事件的促发同样能使用载荷和对象两种形式

6. getter

getter,我们能理解为是对store中state的一些派生状况,也能理解为一类计算属性,它类似于计算属性一样,返回值会根据它的依赖被缓存起来,且依赖对象发生改变的时候它才会被重新计算。

getter属性相当于很数个组件需要对统计数据展开一样的处置,能理解为公共的计算属性。

这样就很清晰了

Getter 接受 state 作为其第两个参数,也能使用箭头函数。

const getters = { get_object: function (state) {//无参 if (state.age < 18) { return state.name + 未成年 } return state.name + 已经成年了 }, get_object2: function (state) {//有参数 return function(value){ return state.name + value; } } }

组件中{this.$store.getters.xxx

<template> <div>我放在store中的统计数据是 {{ this.$store.state.name }}, {{ this.$store.state.age }}<br> <span>不带参数的统计数据:{{ this.$store.getters.get_object }}</span> <br> <span>带参数的统计数据(携带两个刚好18岁):{{ this.$store.getters.get_object2(“刚好18岁”) }}</span> </div> </template>
5分钟让你掌握Vuex,深入浅出

7.Modoules

Vuex 允许我们将 store 分割成组件(module)。每个组件拥有自己的 state、mutation、action、getter、甚至是嵌套子组件。这里就不过多介绍了,看官方文档(Module | Vuex (vuejs.org))

8.辅助函数

vuex提供更多了几个的辅助函数,有mapState、mapGetter、mapMutation、mapAction。都是一些复杂语句的简写形式。

引入函数

import{mapState,mapGetters,mapMutation,mapAction}from vuex

mapState

如果state中的统计数据很多,那我们要重复写很多这样的this.$store.state.XXX代码,我们就能透过mapState来映射。

数组的写法

export default { computed:{ …mapState([name,age])//自动就添加到了计算属性中,此时就能直接像访问计算属性一样访问它 } };

如果你想取名别名的话,就要写成对象的形式

...mapState( { myname: name, myage: “age”, }

mapGetters

mapGetters和mapState很相似,只不过是映射Getters。替代this.$store.getters.XXX

computed: { …mapGetters([get_object,get_object2]),//数组形式写法 …mapGetters({get1:get_object,get2:get_object2})//能取别名,对象形式写法 },

mapMutation

替代this.$store.commit(XXX)

methods: { …mapMutations([modify_age,modify_age2]),//数组形式写法 …mapMutations({modify:modify_age,modify2:modify_age2}),//能取别名,对象形式写法 },

mapAction

替代this.$store.dispatch(XXX)

methods: { …mapActions([asy_modify,asy_modify2]),//数组形式写法 …mapActions({act_modify:asy_modify,act_modify2:asy_modify2})//对象形式写法 },

以上这些辅助函数,涉及到传参都需在使用的计算属性的时候传入。

四、写在最后

更具体的请看官网文档,欢迎各位大佬指点江山。

https://vuex.vuejs.org/zh/#%E4%BB%80%E4%B9%88%E6%98%AF-%E7%8A%B6%E6%80%81%E7%AE%A1%E7%90%86%E6%A8%A1%E5%BC%8F

看到最后点赞收藏吧!

5分钟让你掌握Vuex,深入浅出

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务