vuex学习之路

Vuex理解

vuex是一个专门为vue.js设计的集中式状态管理架构。状态?把它理解为在data中的属性需要共享给其他vue组件使用的部分,就叫做状态。简单的说就是data中需要共用的属性。比如:有几个页面要显示用户名称和用户等级,或者显示用户的地理位置。如果不把这些属性设置为状态,那每个页面遇到后,都会到服务器进行查找计算,返回后再显示。在中大型项目中会有很多共用的数据,所以尤大神给我们提供了vuex。

引入vuex

1.利用npm包管理工具,进行安装 vuex。在控制命令行中输入下边的命令就可以了。


1


npm install vuex --save

需要注意的是这里一定要加上 –save,因为你这个包在生产环境中是要使用的。

2.新建一个vuex文件夹(这个不是必须的),并在文件夹下新建store.js文件,文件中引入我们的vue和vuex。


1

2


import Vue from 'vue';

import Vuex from 'vuex';

3.使用vuex,引入之后用Vue.use进行引用。


1


Vue.use(Vuex);

实例

1.现在我们store.js文件里增加一个常量对象。store.js文件就是我们在引入vuex时的那个文件。


1

2

3


const state={

count:1

}

2.用export default 封装代码,让外部可以引用。


1

2

3

4


export default new Vuex.Store({

state

})

3.新建一个vue的模板,位置在components文件夹下,名字叫count.vue。在模板中我们引入我们刚建的store.js文件,并在模板中用{{$store.state.count}}输出count 的值。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20


<template>

<div>

<h2>{{msg}}</h2>

<hr/>

<h3>{{$store.state.count}}</h3>

</div>

</template>

<script>

import store from '@/vuex/store'

export default{

data(){

return{

msg:'Hello Vuex',

}

},

store

}

</script>

4.在store.js文件中加入两个改变state的方法。


1

2

3

4

5

6

7

8


const mutations={

add(state){

state.count++;

},

reduce(state){

state.count--;

}

}

这里的mutations是固定的写法,意思是改变的,只知道要改变state的数值的方法,必须写在mutations里就可以了。

5.在count.vue模板中加入两个按钮,并调用mutations中的方法。


1

2

3

4


<div>

<button @click="$store.commit('add')">+</button>

<button @click="$store.commit('reduce')">-</button>

</div>

 

State访问状态对象

一、通过computed的计算属性直接赋值

computed属性可以在输出前,对data中的值进行改变,利用这种特性把store.js中的state值赋值给模板中的data值。


1

2

3

4

5


computed:{

count(){

return this.$store.state.count;

}

}

这里需要注意的是return this.$store.state.count这一句,一定要写this,要不会找不到$store的。这种写法很好理解,但是写起来是比较麻烦的。

二、通过mapState的对象来赋值

首先要用import引入mapState。


1


import {mapState} from 'vuex';

然后还在computed计算属性里写如下代码:


1

2

3


computed:mapState({

count:state=>state.count

})

这里使用ES6的箭头函数来给count赋值。

三、通过mapState的数组来赋值


1


computed:mapState(["count"])

 

Mutations修改状态

$store.commit( )

Vuex提供了commit方法来修改状态


1

2


<button @click="$store.commit('add')">+</button>

<button @click="$store.commit('reduce')">-</button>

store.js文件:


1

2

3

4

5

6

7

8


const mutations={

add(state){

state.count++;

},

reduce(state){

state.count--;

}

}

传值:

这只是一个最简单的修改状态的操作,在实际项目中常常需要在修改状态时传值。比如上边的例子,是每次只加1,而现在要通过所传的值进行相加。其实我们只需要在Mutations里再加上一个参数,并在commit的时候传递就就可以了。来看具体代码:

现在store.js文件里给add方法加上一个参数n。添加的地方已经标黄了。


1

2

3

4

5

6

7

8


const mutations={

add(state,n){

state.count+=n;

},

reduce(state){

state.count--;

}

}

在Count.vue里修改按钮的commit( )方法传递的参数,我们传递10,意思就是每次加10.


1

2

3

4


<p>

<button @click="$store.commit('add',10)">+</button>

<button @click="$store.commit('reduce')">-</button>

</p>

这样两个简单的修改就完成了传值,可以在浏览器中实验一下了。

模板获取Mutations方法

实际开发中也不喜欢看到$store.commit( )这样的方法出现,希望跟调用模板里的方法一样调用。

例如:@click=”reduce”   就和没引用vuex插件一样。

要达到这种写法,只需要简单的两部就可以了:

1在模板count.vue里用import 引入我们的mapMutations:


1


import { mapState,mapMutations } from 'vuex';

2在模板的<script>标签里添加methods属性,并加入mapMutations


1

2

3


methods:mapMutations([

'add','reduce'

]),

通过上边两部,已经可以在模板中直接使用的reduce或者add方法了,就像下面这样。


1


<button @click="reduce">-</button>

 

getters计算过滤操作

getters基本用法:

比如现在要对store.js文件中的count进行一个计算属性的操作,就是在它输出前,给它加上100.

首先要在store.js里用const声明我们的getters属性。


1

2

3

4

5


const getters = {

count:function(state){

return state.count +=100;

}

}

写好了gettters之后,还需要在Vuex.Store()里引入,由于之前已经引入了state盒mutations,所以引入里有三个引入属性。代码如下,


1

2

3


export default new Vuex.Store({

state,mutations,getters

})

在store.js里的配置算是完成了,需要到模板页对computed进行配置。在vue 的构造器里边只能有一个computed属性,如果你写多个,只有最后一个computed属性可用,所以要对上写的computed属性进行一个改造。改造时使用ES6中的展开运算符”…”。


1

2

3

4

5

6


computed:{

...mapState(["count"]),

count(){

return this.$store.getters.count;

}

},

需要注意的是,写了这个配置后,在每次count 的值发生变化的时候,都会进行加100的操作。

用mapGetters简化模板写法:

state和mutations都有map的引用方法把模板中的编码进行简化,getters也是有的,来看一下代码。

首先用import引入mapGetters


1


import { mapState,mapMutations,mapGetters } from 'vuex';

在computed属性中加入mapGetters


1


...mapGetters(["count"])

actions异步修改状态

在store.js中声明actions

actions是可以调用Mutations里的方法的,在actions里调用add和reduce两个方法。


1

2

3

4

5

6

7

8


const actions ={

addAction(context){

context.commit('add',10)

},

reduceAction({commit}){

commit('reduce')

}

}

在actions里写了两个方法addAction和reduceAction,在方法体里,都用commit调用了Mutations里边的方法。两个方法传递的参数也不一样。

· context:上下文对象,这里可以理解称store本身。

· {commit}:直接把commit对象传递过来,可以让方法体逻辑和代码更清晰明了。

模板中的使用

需要在count.vue模板中编写代码,让actions生效。先复制两个以前有的按钮,并改成actions里的方法名,分别是:addAction和reduceAction。


1

2

3

4


<p>

<button @click="addAction">+</button>

<button @click="reduceAction">-</button>

</p>

改造一下methods方法,首先还是用扩展运算符把mapMutations和mapActions加入。


1

2

3

4

5

6


methods:{

...mapMutations([

'add','reduce'

]),

...mapActions(['addAction','reduceAction'])

},

要记得用import把的mapActions引入才可以使用。

增加异步检验

现在看的效果和用Mutations作的一模一样,为了演示actions的异步功能,增加一个计时器(setTimeOut)延迟执行。在addAction里使用setTimeOut进行延迟执行。


1

2


setTimeOut(()=>{context.commit(reduce)},3000);

console.log('我比reduce提前执行');

可以看到在控制台先打印出了‘我比reduce提前执行’这句话

Module模块组

声明模块组:

在vuex/store.js中声明模块组,还是用const常量的方法声明模块组。代码如下:


1

2

3


const moduleA={

state,mutations,getters,actions

}

声明好后,需要修改原来 Vuex.Stroe里的值:


1

2

3


export default new Vuex.Store({

modules:{a:moduleA}

})

在模板中使用

现在要在模板中使用count状态,要用插值的形式写入。


1


<h3>{{$store.state.a.count}}</h3>

如果想用简单的方法引入,还是要在计算属性中retrun状态。写法如下:


1

2

3

4

5


computed:{

count(){

return this.$store.state.a.count;

}

},

全部代码实例

Store代码:

具体用法demo

原文地址:http://blog.51cto.com/13507333/2087051

时间: 2024-08-29 11:30:56

vuex学习之路的相关文章

Azure云平台学习之路(三)——Cloud Services

1.什么是云服务? 能够部署高度可用的且可无限缩放的应用程序和API.简而言之,就是你写的CMD程序按照一定的框架进行少量修改就能运行在Azure云平台上. 2.Azure云服务有什么特点? (1)专注应用程序而不是硬件,PaaS的一种. (2)支持多种框架和语言. (3)集成了运行状况监视和负载平衡. (4)自动缩放优化成本和性能 3.建立云服务之前,我们需要建立一个云存储,来记录我们的程序的日志信息(当然,这不是必须的) (1)选择左边导航栏的"存储".主面板上显示的是所有已有的存

linux学习之路之LVM

试想一种情况,当初我们在规划磁盘的时候,只给某一个磁盘或分区之划分了30G的容量,但是后来,随着业务的需求,该磁盘或者分区的使用量会越来越大,等到以后再有数据存放时,发现该磁盘或者分区的容量不够用,此时该怎么办了?可以新增一个磁盘,经过格式化,挂载等过程就可以使用这个磁盘了,再将原来磁盘的数据完全的复制过来.等到后来又发现,规划的磁盘又太大了,然后又使用上述方法来减少磁盘的大小.虽然这种方法可行,但是效率低,比较复杂.不应该是我们首选的方法. 当然,我们可以这样做,将多个磁盘或者分区(PV)组合

我的算法学习之路

关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口--况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程.然而这门课程并没有让我入门--当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾--反正最后考试划个重点也能过,于是这门整个计算机专业本

一个女大学生的代码学习之路(二)

首先说一下,写这种文章是由于我在四月四日晚上,在手动搭建自己的第一个ssh项目的时候,遇到了一个配置的问题,怎么解决也弄不好,当时是四号晚上九点,我看了一眼表,我就想两个小时之内,我要是能搞定就算行了,但是其实,我搞到三点才OK(凌晨),那时候已经是五号了,转天是一家子去扫墓的时候,结果我居然以这种一个理由没有去,理由是我太累了么?我只是就是搭了一个架子,就是由于我的包太混乱了,导致不兼容,所以tomcat总也不启动,你可能认为好笑,这么简单一个问题怎么就费这多多时间呢,但是作为一个刚接触三框架

kafka学习之路(二)——提高

kafka学习之路(二)--提高 消息发送流程 因为Kafka内在就是分布式的,一个Kafka集群通常包括多个代理.为了均衡负载,将话题分成多个分区,每个代理存储一或多个分区.多个生产者和消费者能够同时生产和获取消息.     过程: 1.Producer根据指定的partition方法(round-robin.hash等),将消息发布到指定topic的partition里面 2.kafka集群接收到Producer发过来的消息后,将其持久化到硬盘,并保留消息指定时长(可配置),而不关注消息是否

Android开发学习之路--网络编程之xml、json

一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载xampp,然后安装之类的就不再多讲了,参考http://cnbin.github.io/blog/2015/06/05/mac-an-zhuang-he-shi-yong-xampp/.安装好后,启动xampp,之后在浏览器输入localhost或者127.0.0.1就可以看到如下所示了: 这个就

Qt学习之路

  Qt学习之路_14(简易音乐播放器) Qt学习之路_13(简易俄罗斯方块) Qt学习之路_12(简易数据管理系统) Qt学习之路_11(简易多文档编辑器) Qt学习之路_10(Qt中statusBar,MessageBox和Timer的简单处理) Qt学习之路_9(Qt中Item Widget初步探索) Qt学习之路_8(Qt中与文件目录相关操作) Qt学习之路_7(线性布局和网格布局初步探索) Qt学习之路_6(Qt局域网聊天软件) Qt学习之路_5(Qt TCP的初步使用) Qt学习之路

Java学习之路(二)--Thinking in Java

针对昨天Java学习之路(一)--Thinking in Java中的类的静态方法不能访问创建非静态类,给出了将内部类修改成为static静态类,操作方便简单.现在给出第二种不需要添加删除的另一种极为高效的方式.可以将内部类从你所创建的类中复制粘贴到类外,作为一个外部类,在static主方法中就可以创建类的引用了. 源代码如下: ? class test{ int s; char c; } public class test1 { public static class test{ int s;

Linux常用命令学习之路(每天都会更新)

Linux学习之路 1:显示日期时间的命令:date date->可以显示出星期月日时分秒年 date +%Y/%m/%d->可以显示出:年/月/日(date后面必须有至少一个空格) date +%H:%M:%S->显示出:时:分:秒(date后面必须有至少一个空格) date +%h->显示:月(英文的) 2:显示日历命令:cal: cal ->显示当月的日历 cal 2009->显示整个2009的日历 cal 10 2009->显示2009年10月的日历 3: