[Vuex系列] - Mutation的具体用法
更改 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的具体用法的更多相关文章
- Spring3系列5-Bean的基本用法
Spring3系列5-Bean的基本用法 本篇讲述了Bean的基本配置方法,以及Spring中怎样运用Bean. 主要内容如下: 一. Spring中Bean的相互引用 二. Sp ...
- 学习javascript基础知识系列第二节 - this用法
通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...
- SpringBoot系列之@Conditional注解用法简介
SpringBoot系列之@Conditional注解用法简介 引用Spring官方文档的说法介绍一下@Conditional注解:Spring5.0.15版本@Conditional注解官方文档 @ ...
- SpringBoot系列之外部配置用法简介
SpringBoot系列之外部配置用法简介 引用Springboot官方文档的说法,官方文档总共列举了如下用法: 1.Devtools global settings properties on yo ...
- [Vuex系列] - Module的用法(终篇)
于使用单一状态树,应用的所有状态会集中到一个比较大的对象.当应用变得非常复杂时,store 对象就有可能变得相当臃肿.为了解决以上问题,Vuex 允许我们将 store 分割成模块(module).每 ...
- [Vuex系列] - 细说state的几种用法
state 存放的是一个对象,存放了全部的应用层级的状态,主要是存放我们日常使用的组件之间传递的变量. 我们今天重点讲解下state的几种用法,至于如何从头开始创建Vuex项目,请看我写的第一个文章. ...
- 挑战全网最幽默的Vuex系列教程:第三讲 Vuex旗下的Mutation
写在前面 上一讲「Vuex 旗下的 State 和 Getter」,告诉了我们怎么去使用仓库 store 中的状态数据.当然,光会用肯定还不够,大部分的应用场景还得对这些状态进行操控,那么具体如何操控 ...
- [Vuex系列] - Vuex中的getter的用法
Vuex 允许我们在store中定义“getter”(可以认为是store的计算属性).就像计算属性一样,getter的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算. g ...
- vuex之Mutation(三)
说明 既然我们可以取出数据,就可以修改数据,而修改数据并不是像修改data的数据一样,直接 this.xxx = xxx,这样有一个问题,在实际开发中,state的数据一般会多个组件共享,如果可以使用 ...
随机推荐
- js刷新页面location.reload()用法
转: js刷新页面location.reload()用法 2018年05月10日 10:23:28 大灰狼的小绵羊哥哥 阅读数 31359更多 分类专栏: [前端面试点滴知识 ] 本文介绍了js刷 ...
- 遍历List集合删除元素的出现报错
遍历List集合删除元素的出现报错 遍历List集合删除元素的时候会发生索引越界异常或内容遍历不全等问题. 例子: List<String> al = new ArrayList< ...
- web自动化-selenium+Chrome驱动国内下载地址+驱动对应Chrome版本号
selenium各版本下载地址 http://selenium-release.storage.googleapis.com/index.html 国内下载:http://npm.taobao.org ...
- SpringCloud学习成长之 十 高可用服务注册中心
文章 第一篇: 服务的注册与发现(Eureka) 介绍了服务注册与发现,其中服务注册中心Eureka Server,是一个实例,当成千上万个服务向它注册的时候,它的负载是非常高的,这在生产环境上是不太 ...
- 【设计思路】Booking优化
https://www.uisdc.com/booking-redesign https://medium.muz.li/booking-com-ux-case-study-7ffb39e54791
- 网络损伤仪细分市场:eCPRI网络损伤的技术要求
关于“网络损伤仪”的叫法 网络损伤仪,也称作为广域网仿真仪,广域网损伤仪,WAN Emulation,Network Impairment Emulator. 为什么会带WAN广域网这个限定词? 应该 ...
- conda安装的国内镜像配置,实现快速下载
conda安装的国内镜像配置,实现快速下载 anaconda的所有的软件包全部在国外,安装起来很麻烦,关键是下载速度慢,而且经常中断,所以需要配置国内安装的镜像,下载速度就很快了. 一.conda换国 ...
- javascript 数组和对象的浅复制和深度复制 assign/slice/concat/JSON.parse(JSON.stringify())
javascript 数组和对象的浅度复制和深度复制在平常我们用 ‘=’来用一个变量引用一个数组或对象,这里是‘引用’而不是复制下面我们看一个例子引用和复制是什么概念 var arr=[1,2,3,' ...
- LC 3. Longest Substring Without Repeating Characters
题目描述 Given a string, find the length of the longest substring without repeating characters. Example ...
- 笔记-9:使用random库生成随机数
random:主要目的是生成随机数 函数 说明 seed(a=None) 初始化随机数,默认值为当前系统时间 random() 生成一个[0.0,1.0)之间的随机数小数 randint(a,b) 生 ...