更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。

接下来我们还是用上一篇文章在state中存放的count为例,来看利用Mutation修改state的count属性。

利用commit来触发mutation函数

在mutation函数中添加count的add函数

const mutations = {
addNum (state) {
state.num++
},
add (state) {
state.count += 2
}
}
export default mutations

在组件中使用mutation进行实现叠加器

<template>
<div class="mutation">
<p>{{ count }}</p>
<button @click="addCount">+ADD</button>
</div>
</template> <script>
import store from '@/store/store'
export default {
computed: {
count () {
return this.$store.state.count
}
},
methods: {
addCount () {
store.commit('add')
}
}
}
</script>

Mutation的载荷(payload)

你可以向store.commit传入额外的参数,即mutation的载荷(payload):我们还是以上面累加器的例子来实现mutation函数的传参,来动态定义累加的数量。

在mutation.js中修改add方法

const mutations = {
addNum (state) {
state.num++
},
add (state, n) {
state.count += n
}
} export default mutations

在组件中store.commit如何传参

<template>
<div class="mutation">
<p>{{ count }}</p>
<button @click="addCount">+ADD</button>
</div>
</template> <script>
import store from '@/store/store'
export default {
computed: {
count () {
return this.$store.state.count
}
},
methods: {
addCount () {
store.commit('add', 5)
}
}
}
</script>

在mutation传参(载荷)可以传递一个参数也可以传递一个对象。让我们修改下上面的例子

mutation.js文件中修改如下

const mutations = {
addNum (state) {
state.num++
},
add (state, payload) {
state.count += payload.amount
}
} export default mutations

组件中修改如下

<template>
<div class="mutation">
<p>{{ count }}</p>
<button @click="addCount">+ADD</button>
</div>
</template> <script>
import store from '@/store/store'
export default {
computed: {
count () {
return this.$store.state.count
}
},
methods: {
addCount () {
store.commit('add', { amount: 10 })
}
}
}
</script>

在store.commit中可以进行对象风格的提交

依据上面的例子,我们将组件中内容修改如下

<template>
<div class="mutation">
<p>{{ count }}</p>
<button @click="addCount">+ADD</button>
</div>
</template> <script>
import store from '@/store/store'
export default {
computed: {
count () {
return this.$store.state.count
}
},
methods: {
addCount () {
store.commit({
type: 'add',
amount: 8
})
}
}
}
</script>

使用常量替代 Mutation 事件类型

使用常量替代mutation事件类型在各种Flux实现中是很常见的模式。这样可以使 linter之类的工具发挥作用,同时把这些常量放在单独的文件中可以让你的代码合作者对整个项目包含的mutation一目了然。这在在需要多人协作的大型项目中,这会很有帮助。

我们在store中新建mutation-types.js文件,文件内容如下

export const SOME_MUTATION = 'SOME_MUTATION'

在mutation.js文件内容如下

import { ADD } from './mutation-types'
const mutations = {
addNum (state) {
state.num++
},
[ADD] (state) {
state.count++
}
} export default mutations

在组件中内容和之前一致

<template>
<div class="mutation">
<p>{{ count }}</p>
<button @click="addCount">+ADD</button>
</div>
</template> <script>
import store from '@/store/store'
export default {
computed: {
count () {
return this.$store.state.count
}
},
methods: {
addCount () {
store.commit('add')
}
}
}
</script>

在组件中使用this.$store全局属性来触发mutation函数

<template>
<div class="mutation">
<p>{{ count }}</p>
<button @click="add">+ADD</button>
</div>
</template> <script>
export default {
computed: {
count () {
return this.$store.state.count
}
},
methods: {
add () {
this.$store.commit('add')
}
}
}
</script>

在组件中使用mapMutations辅助函数

<template>
<div class="mutation">
<p>{{ count }}</p>
<button @click="add">+ADD</button>
</div>
</template> <script>
import { mapMutations } from 'vuex'
export default {
computed: {
count () {
return this.$store.state.count
}
},
methods: {
...mapMutations(['add'])
}
}
</script>

Mutation一条重要的原则就是要记住 mutation 必须是同步函数

[Vuex系列] - Mutation的具体用法的更多相关文章

  1. Spring3系列5-Bean的基本用法

    Spring3系列5-Bean的基本用法 本篇讲述了Bean的基本配置方法,以及Spring中怎样运用Bean. 主要内容如下: 一.      Spring中Bean的相互引用 二.      Sp ...

  2. 学习javascript基础知识系列第二节 - this用法

    通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...

  3. SpringBoot系列之@Conditional注解用法简介

    SpringBoot系列之@Conditional注解用法简介 引用Spring官方文档的说法介绍一下@Conditional注解:Spring5.0.15版本@Conditional注解官方文档 @ ...

  4. SpringBoot系列之外部配置用法简介

    SpringBoot系列之外部配置用法简介 引用Springboot官方文档的说法,官方文档总共列举了如下用法: 1.Devtools global settings properties on yo ...

  5. [Vuex系列] - Module的用法(终篇)

    于使用单一状态树,应用的所有状态会集中到一个比较大的对象.当应用变得非常复杂时,store 对象就有可能变得相当臃肿.为了解决以上问题,Vuex 允许我们将 store 分割成模块(module).每 ...

  6. [Vuex系列] - 细说state的几种用法

    state 存放的是一个对象,存放了全部的应用层级的状态,主要是存放我们日常使用的组件之间传递的变量. 我们今天重点讲解下state的几种用法,至于如何从头开始创建Vuex项目,请看我写的第一个文章. ...

  7. 挑战全网最幽默的Vuex系列教程:第三讲 Vuex旗下的Mutation

    写在前面 上一讲「Vuex 旗下的 State 和 Getter」,告诉了我们怎么去使用仓库 store 中的状态数据.当然,光会用肯定还不够,大部分的应用场景还得对这些状态进行操控,那么具体如何操控 ...

  8. [Vuex系列] - Vuex中的getter的用法

    Vuex 允许我们在store中定义“getter”(可以认为是store的计算属性).就像计算属性一样,getter的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算. g ...

  9. vuex之Mutation(三)

    说明 既然我们可以取出数据,就可以修改数据,而修改数据并不是像修改data的数据一样,直接 this.xxx = xxx,这样有一个问题,在实际开发中,state的数据一般会多个组件共享,如果可以使用 ...

随机推荐

  1. osg模型部分节点旋转

    osg::ref_ptr<osg::Geode> CreateBox() { osg::ref_ptr<osg::Geode> geode = new osg::Geode; ...

  2. 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_02-Eureka注册中心-搭建Eureka单机环境

    我们先搭建单机环境 govern是治理的意思, 这样就把工程创建好了 创建包 创建SpringBoot的启动类. 在父工程里面已经确定了Spring Cloud的版本了.相当于锁定了版本 接下里只需要 ...

  3. Spring Cloud(7.1):安装Kafka和Redis

    Kafka安装 (1)从官方(http://kafka.apache.org/downloads)下载安装包.kafka安装包和一般安装包的命名方式不一样,我们看一个kafka包命名:kafka_2. ...

  4. 【Leetcode_easy】762. Prime Number of Set Bits in Binary Representation

    problem 762. Prime Number of Set Bits in Binary Representation solution1: class Solution { public: i ...

  5. Mac OS X下把 /etc/sudoers 写错了怎么办?(转载https://blog.csdn.net/robertsong2004/article/details/53725285)

    重要的事情先说一下,首先为了回避这个问题,一定要用 visudo 来改 /etc/sudoers 文件. 问题描述: 1. 用  sudo vi 直接改 /etc/sudoers 并覆盖原文件. 2. ...

  6. Servlet 响应及请求信息

    // 文件路径 D:\ApacheServer\web_java\HelloWorld\src\com\test\TestServletRequestrResponse.java package co ...

  7. Hystrix的介绍(断路、降级)

    在大中型分布式系统中,通常系统很多依赖(HTTP,hession,Netty,Dubbo等),如下图:     在高并发访问下,这些依赖的稳定性与否对系统的影响非常大,但是依赖有很多不可控问题:如网络 ...

  8. 利用Python进行数据分析_Pandas_数据加载、存储与文件格式

    申明:本系列文章是自己在学习<利用Python进行数据分析>这本书的过程中,为了方便后期自己巩固知识而整理. 1 pandas读取文件的解析函数 read_csv 读取带分隔符的数据,默认 ...

  9. 利用Python进行数据分析_Numpy_基础_3

    通用函数:快速的元素级数组函数 通用函数,是指对数组中的数据执行元素级运算的函数:接受一个或多个标量值,并产生一个或多个标量值. sqrt 求平方根 np.sqrt(arr) exp 计算各元素指数 ...

  10. python 手机App数据抓取实战一

    前言 当前手机使用成为互联网主流,每天手机App产生大量数据,学习爬虫的人也不能只会爬取网页数据,我们需要学习如何从手机 APP 中获取数据,本文就以豆果美食为例,讲诉爬取手机App的流程 环境准备 ...