VueJS中学习使用Vuex详解

在SPA单页面组件的开发中 Vue的vuex和React的Redux 都统称为同一状态管理,个人的理解是全局状态管理更合适;简单的理解就是你在state中定义了一个数据之后,你可以在所在项目中的任何一个组件里进行获取、进行修改,并且你的修改可以得到全局的响应变更。下面咱们一步一步地剖析下vuex的使用:

首先要安装、使用 vuex

首先在 vue 2.0+ 你的vue-cli项目中安装 vuex :

npm install vuex --save

然后 在src文件目录下新建一个名为store的文件夹,为方便引入并在store文件夹里新建一个index.js,里面的内容如下:

import Vue from ‘vue‘;

import Vuex from ‘vuex‘;

Vue.use(Vuex);

const store = new Vuex.Store();

export default store;

接下来,在 main.js里面引入store,然后再全局注入一下,这样一来就可以在任何一个组件里面使用this.$store了:

import store from ‘./store‘//引入store

new Vue({

el: ‘#app‘,

router,

store,//使用store

template: ‘‘,

components: { App }

})

说了上面的前奏之后,接下来就是纳入正题了,就是开篇说的state的玩法。回到store文件的index.js里面,我们先声明一个state变量,并赋值一个空对象给它,里面随便定义两个初始属性值;然后再在实例化的Vuex.Store里面传入一个空对象,并把刚声明的变量state仍里面:

import Vue from ‘vue‘;

import Vuex from ‘vuex‘;

Vue.use(Vuex);

const state={//要设置的全局访问的state对象

showFooter: true,

changableNum:0

//要设置的初始属性值

};

const store = new Vuex.Store({

state

});

export default store;

实际上做完上面的三个步骤后,你已经可以用this.或store.state.changebleNum在任何一个组件里面获取showfooter和changebleNum定义的值了,但这不是理想的获取方式;vuex官方API提供了一个getters,和vue计算属性computed一样,来实时监听state值的变化(最新状态),并把它也仍进Vuex.Store里面,具体看下面代码:

import Vue from ‘vue‘;

import Vuex from ‘vuex‘;

Vue.use(Vuex);

const state={ //要设置的全局访问的state对象

showFooter: true,

changableNum:0

//要设置的初始属性值

};

const getters = { //实时监听state值的变化(最新状态)

isShow(state) { //方法名随意,主要是来承载变化的showFooter的值

return state.showFooter

},

getChangedNum(){ //方法名随意,主要是用来承载变化的changableNum的值

return state.changebleNum

}

};

const store = new Vuex.Store({

state,

getters

});

export default store;

光有定义的state的初始值,不改变它不是我们想要的需求,接下来要说的就是mutations了,mutattions也是一个对象,这个对象里面可以放改变state的初始值的方法,具体的用法就是给里面的方法传入参数state或额外的参数,然后利用vue的双向数据驱动进行值的改变,同样的定义好之后也把这个mutations扔进Vuex.Store里面,如下:

import Vue from ‘vue‘;

import Vuex from ‘vuex‘;

Vue.use(Vuex);

const state={ //要设置的全局访问的state对象

showFooter: true,

changableNum:0

//要设置的初始属性值

};

const getters = { //实时监听state值的变化(最新状态)

isShow(state) { //承载变化的showFooter的值

return state.showFooter

},

getChangedNum(){ //承载变化的changebleNum的值

return state.changableNum

}

};

const mutations = {

show(state) { //自定义改变state初始值的方法,这里面的参数除了state之外还可以再传额外的参数(变量或对象);

state.showFooter = true;

},

hide(state) { //同上

state.showFooter = false;

},

newNum(state,sum){ //同上,这里面的参数除了state之外还传了需要增加的值sum

state.changableNum+=sum;

}

};

const store = new Vuex.Store({

state,

getters,

mutations

});

export default store;

这时候你完全可以用 this.或store.commit(‘hide‘) 以及 this.在别的组件里面进行改变和的值了,但这不是理想的改变值的方式;因为在中,里面的方法都是同步事务,意思就是说:比如这里的一个store.commit(‘newNum‘,sum)方法,两个组件里用执行得到的值,每次都是一样的,这样肯定不是理想的需求

好在vuex官方API还提供了一个actions,这个actions也是个对象变量,最大的作用就是里面的Action方法 可以包含任意异步操作,这里面的方法是用来异步触发mutations里面的方法,actions里面自定义的函数接收一个context参数和要变化的形参,context与store实例具有相同的方法和属性,所以它可以执行context.commit(‘ ‘),然后也不要忘了把它也扔进Vuex.Store里面:

import Vue from ‘vue‘;

import Vuex from ‘vuex‘;

Vue.use(Vuex);

const state={ //要设置的全局访问的state对象

showFooter: true,

changableNum:0

//要设置的初始属性值

};

const getters = { //实时监听state值的变化(最新状态)

isShow(state) { //承载变化的showFooter的值

return state.showFooter

},

getChangedNum(){ //承载变化的changebleNum的值

return state.changableNum

}

};

const mutations = {

show(state) { //自定义改变state初始值的方法,这里面的参数除了state之外还可以再传额外的参数(变量或对象);

state.showFooter = true;

},

hide(state) { //同上

state.showFooter = false;

},

newNum(state,sum){ //同上,这里面的参数除了state之外还传了需要增加的值sum

state.changableNum+=sum;

}

};

const actions = {

hideFooter(context) { //自定义触发mutations里函数的方法,context与store 实例具有相同方法和属性

context.commit(‘hide‘);

},

showFooter(context) { //同上注释

context.commit(‘show‘);

},

getNewNum(context,num){ //同上注释,num为要变化的形参

context.commit(‘newNum‘,num)

}

};

const store = new Vuex.Store({

state,

getters,

mutations,

actions

});

export default store;

而在外部组件里进行全局执行actions里面方法的时候,你只需要用执行

this.$store.dispatch(‘hideFooter‘)

或this.$store.dispatch(‘showFooter‘)

以及this.$store.dispatch(‘getNewNum‘,6) //6要变化的实参

这样就可以全局改变改变showfooter或changebleNum的值了,如下面的组件中,需求是跳转组件页面后,根据当前所在的路由页面进行隐藏或显示页面底部的tabs选项卡

    }else{
       this.$store.dispatch(‘hideFooter‘)
    }
  }

}

}

至此就可以做到一呼百应的全局响应状态改变了!

modules 模块化 以及 组件中引入 mapGetters、mapActions 和 mapStates的使用

因为在大多数的项目中,我们对于全局状态的管理并不仅仅一种情况的需求,有时有多方面的需求,比如写一个商城项目,你所用到的全局state可能是关于购物车这一块儿的也有可能是关于商品价格这一块儿的;像这样的情况我们就要考虑使用vuex中的 modules 模块化了,具体怎么使用modules呢?咱们继续一步一步的走:

首先,在store文件夹下面新建一个modules文件夹,然后在modules文件里面建立需要管理状态的js文件,既然要把不同部分的状态分开管理,那就要把它们给分成独立的状态文件了,如下图:

而对应的store文件夹下面的index.js 里面的内容就直接改写成:

import Vue from ‘vue‘;

import Vuex from ‘vuex‘;

import footerStatus from ‘./modules/footerStatus‘

import collection from ‘./modules/collection‘

Vue.use(Vuex);

export default new Vuex.Store({

modules:{

footerStatus,

collection

}

});

相应的js,其中的 namespaced:true 表示当你需要在别的文件里面使用( mapGetters、mapActions 接下来会说 )时,里面的方法需要注明来自哪一个模块的方法:

//collection.js

const state={

collects:[], //初始化一个colects数组

};

const getters={

renderCollects(state){ //承载变化的collects

return state.collects;

}

};

const mutations={

pushCollects(state,items){ //如何变化collects,插入items

state.collects.push(items)

}

};

const actions={

invokePushItems(context,item){ //触发mutations里面的pushCollects ,传入数据形参item 对应到items

context.commit(‘pushCollects‘,item);

}

};

export default {

namespaced:true,//用于在全局引用此文件里的方法时标识这一个的文件名

state,

getters,

mutations,

actions

}

//footerStatus.js

const state={ //要设置的全局访问的state对象

showFooter: true,

changableNum:0

//要设置的初始属性值

};

const getters = { //实时监听state值的变化(最新状态)

isShow(state) { //承载变化的showFooter的值

return state.showFooter

},

getChangedNum(){ //承载变化的changebleNum的值

return state.changableNum

}

};

const mutations = {

show(state) { //自定义改变state初始值的方法,这里面的参数除了state之外还可以再传额外的参数(变量或对象);

state.showFooter = true;

},

hide(state) { //同上

state.showFooter = false;

},

newNum(state,sum){ //同上,这里面的参数除了state之外还传了需要增加的值sum

state.changableNum+=sum;

}

};

const actions = {

hideFooter(context) { //自定义触发mutations里函数的方法,context与store 实例具有相同方法和属性

context.commit(‘hide‘);

},

showFooter(context) { //同上注释

context.commit(‘show‘);

},

getNewNum(context,num){ //同上注释,num为要变化的形参

context.commit(‘newNum‘,num)

}

};

export default {

namespaced: true, //用于在全局引用此文里的方法时标识这一个的文件名

state,

getters,

mutations,

actions

}

这样一改就有了关于两个模块的state管理文件了 footerStatus.js和collection.js,现在你要运行当前的代码话,项目会报错!因为我们把上面的代码模块化分开了,引用的地方还没有改。接下来咱们一起来看看 mapState,mapGetters,mapActions的使用,首先 在需要用的 组件里面先导入 import {mapState,mapGetters,mapActions} from ‘vuex‘;咱们先修正一下隐藏或显示页面底部的tabs选项卡(就是上面举的临时例子)的组件代码

现在项目代码应该就不会报错了,好,最后咱们再来看一下mapActions的用法,实际上上面的this.$store.dispatch(‘footerStatus/showFooter‘)已经算是一种执行相应模块的action里的方法了,但有时会牵扯的事件的触发及传值,那就会有下面的mapActions用法了,还记得上面的另一个模块collection.js吗?来看一下里面的actions中的方法结构:

const state={

collects:[], //初始化一个colects数组

};

const getters={

renderCollects(state){ //承载变化的collects

return state.collects;

}

};

const mutations={

pushCollects(state,items){ //如何变化collects,插入items

state.collects.push(items)

}

};

const actions={

invokePushItems(context,item){ //触发mutations里面的pushCollects ,传入数据形参item 对应到items

context.commit(‘pushCollects‘,item);

}

};

需要传值来实时变动state.collects里的数据,那肯定要在执行它的地方进行传值了,所以下面用到它的地方我们用了个@click来执行这个invokePushItems方法了,并且传入相应的对象数据item,如下:


全国改性料通讯录
加入收藏列

这样一来,在这个组件里面操作的 collecttion.js 中的state的数据,在其他的任何的一个组件里面都会得到相应的更新变化了,获取状态的页面代码如下:

  • {{val.productName}}

    {{val.price}}

至此,vuex中的常用的一些知识点使用算是简单的分享完了,当然了,相信这些只是一些皮毛!只能说是给予刚接触vuex的初学者一个参考与了解吧!有哪里不明白的或不对的,留言下,咱们可以一起讨论、共同学习!

原文地址:https://www.cnblogs.com/T888888/p/12639181.html

时间: 2024-10-07 19:58:09

VueJS中学习使用Vuex详解的相关文章

Vue.js中学习使用Vuex详解

在SPA单页面组件的开发中 Vue的vuex和React的Redux 都统称为同一状态管理,个人的理解是全局状态管理更合适:简单的理解就是你在state中定义了一个数据之后,你可以在所在项目中的任何一个组件里进行获取.进行修改,并且你的修改可以得到全局的响应变更.下面咱们一步一步地剖析下vuex的使用:首先要安装.使用 vuex首先在 vue 2.0+ 你的vue-cli项目中安装 vuex : npm install vuex --save 然后 在src文件目录下新建一个名为store的文件

Android学习Scroller(五)——详解Scroller调用过程以及View的重绘

MainActivity如下: package cc.ww; import android.os.Bundle; import android.widget.ImageView; import android.widget.ImageView.ScaleType; import android.widget.RelativeLayout; import android.widget.RelativeLayout.LayoutParams; import android.app.Activity;

Java中的main()方法详解

在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是public static void 类型的,方法必须接收一个字符串数组的参数等等. 在看Java中的main()方法之前,先看一个最简单的Java应用程序HelloWorld,我将通过这个例子说明Java类中main()方法的奥秘,程序的代码如下: 1 /** 2 * Java中的main()方法

word2vec 中的数学原理详解

word2vec 中的数学原理详解 word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Mikolov 在两篇相关的论文 [3,4] 中并没有谈及太多算法细节,因而在一定程度上增加了这个工具包的神秘感.一些按捺不住的人于是选择了通过解剖源代码的方式来一窥究竟. 第一次接触 word2vec 是 2013 年的 10 月份,当时读了复旦大学郑骁庆老师发表的论文

JBPM学习(六):详解流程图

概念: 流程图的组成: a. 活动 Activity / 节点 Node b. 流转 Transition / 连线(单向箭头) c. 事件 1.流转(Transition) a) 一般情况一个活动中可以指定一个或多个Transition i. 开始活动(Start)中只能有一个Transition. ii. 结束活动(End)中没有Transition. iii. 其他活动中有一条或多条Transition b) 如果Transition只有一个,则可以不指定名称(名称是null):如果有多个

图像处理中的数学原理详解18——内积与外积

欢迎关注我的博客专栏"图像处理中的数学原理详解" 全文目录请见 图像处理中的数学原理详解(总纲) http://blog.csdn.net/baimafujinji/article/details/48467225 图像处理中的数学原理详解(已发布的部分链接整理) http://blog.csdn.net/baimafujinji/article/details/48751037 1.3.2 内积与外积 因为cos(π/2)=0.当然,这也是众多教科书上介绍向量内积最开始时常常用到的一

iOS学习--UIScrollView 原理详解

iOS学习--UIScrollView 原理详解 http://blog.csdn.net/yanfangjin/article/details/7898189 ScrollView UIScrollView UIScrollView为了显示多于一个屏幕的内容或者超过你能放在内存中的内容. Scroll View为你处理缩小放大手势,UIScrollView实现了这些手势,并且替你处理对于它们的探测和回应.其中需要注意的子类是UITableView以及UITextView(用来显示大量的文字).

后缀数组学习笔记【详解|图】

后缀数组学习笔记[详解] 老天,一个后缀数组不知道看了多少天,最后终于还是看懂了啊! 最关键的就是一会儿下标表示排名,一会用数值表示排名绕死人了. 我不知道手跑了多少次才明白过来.其实我也建议初学者手跑几遍,但是一定要注意数组的意义,否则就是无用功. 数组含义: s[ ]:输入的字符串,预处理的时候会在末尾加上一个0 sa[ ]:它的下标就是后缀排名 x[ ] = t[ ]:用来保存第一关键字排名,注意!它的数值是排名.初始时恰好是字符串的ASCII码.字典序嘛! y[ ] = t2[ ]:它的

Swift学习——Swift基础详解(四)

A:小儿编程很不好! B:多半是不爱学,从看英文版开始,让你爱上编程! Type Aliases    类型重定义(typedef) Swift中重定义类型的关键字是typealias,至于怎么用,应该不必多说了,看例子: typealias AudioSample = UInt16 //定义了一个类型名称AudioSample,代表UInt16类型 var maxAmplitudeFound = AudioSample.min // maxAmplitudeFound is now 0 Boo