Vuex中mutations的用法

在 Vuex 中 store 数据改变的唯一方法就是提交 mutationsmutations里面装着一些改变数据方法的集合,这是Vuex 设计很重要的一点,就是把处理数据逻辑方法全部放在 mutations 里面,使得数据和视图分离。

Mutations使用
Vuex 中的 mutations 非常类似于事件,每个 mutations 都有一个字符串的事件类型(type)和一个回调函数(handler),也可以理解为{type:handler()},这和订阅发布有点类似。先注册事件,当触发响应类型的时候调用handker(),调用type的时候需要用到store.commit方法。

示例:
这个回调函数会接受state 作为第一个参数:

const store = new Vuex.Store({state: {count: 1},mutations: {// 事件类型 type 为 incrementincrement (state) { // 变更状态state.count++}}
})

我们不能直接使用store.mutations.increment() 来调用,Vuex 规定必须使用 store.commit 来触发对应 type 的方法:

store.commit('increment')

提交载荷(Payload)

载荷简单的理解就是往 handler(state) 中传参 handler(state, pryload) 。

示例:
大多数情况下,载荷是一个对象:

mutations: {// 提交荷载increment (state, payload) {state.count += payload.amount}
}

提交荷载有两种方式:

// 把载荷和type分开提交
store.commit('increment', {amount: 10
})// 整个对象都作为载荷传给mutation函数
store.commit({type: 'increment',amount: 10
})

我们可以根据自己的方式来选择使用哪种提交方式。

commit 我们可以在组件中使用 this.$store.commit(‘xxx’) 提交 mutations。

示例:
或者可以使用 mapMutations 辅助函数将组件中的 methods 映射为 store.commit 调用(需要在根节点注入 store)。

示例:
在使用mapMutations 辅助函数之前同样需要先引入:

<script>
import { mapMutations } from 'vuex'
export default {computed:{count(){return this.$store.state.count}},methods:{...mapMutations([//采用解构的方式引入'increment','decrement'])}
}
</script>

Mutations 需遵守 Vue 的响应规则
Vuex 的 store 中的状态是响应式的,所以当我们变更状态时,监视状态的 Vue 组件也会自动更新。

这也意味着 Vuex 中的 mutations 也需要与使用 Vue 一样遵守一些注意事项,如下所示:

最好提前在 store 中初始化好所有所需属性。
当需要在对象上添加新属性时,应该使用 Vue.set(obj, ‘newProp’, 123),或者以新对象替换老对象。例如利用对象展开运算符可以写成:state.obj = {…state.obj, newProp: 123 }。
使用常量替代 Mutations 事件类型
使用常量替代 mutations 事件类型在各种 Flux 实现中是很常见的模式。这样可以使 linter 之类的工具发挥作用,同时把这些常量放在单独的文件中可以让你的代码合作者对整个 app 包含的 mutations 一目了然:

// mutation-types.js
export const SOME_MUTATION = 'SOME_MUTATION'

store.js 文件内容如下所示:

// store.js
import Vuex from 'vuex'
import { SOME_MUTATION } from './mutation-types'const store = new Vuex.Store({state: { ... },mutations: {// 使用 ES2015 风格的计算属性命名功能来使用一个常量作为函数名[SOME_MUTATION] (state) {// mutate state}}
})

我们知道mutation 是通过store.commit(‘increment’)的方式调用的,其中increment方法是以字符串的形式代入。如果项目小,一个人开发的话倒还好,但是项目大了,编写代码的人多了,那就麻烦了,因为需要 commit 的方法一多,就会显得特别混乱,而且以字符串形式代入的话,一旦出了错,很难排查。

所以,在需要多人协作的大型项目中,最好还是用常量的形式来处理 mutation。

必须是同步函数
我们要记住的是,Mutation 必须是同步函数。

因为我们之所以要通过提交 mutation 的方式来改变状态数据,是因为我们想要更明确地追踪到状态的变化。如果是类似下面这样异步的话:

mutations: {someMutation (state) {api.callAsyncMethod(() => {state.count++})}
}

我们就不知道什么时候状态会发生改变,所以也就无法追踪了,这与 Mutation 的设计初心相悖,所以强制规定它必须是同步函数。

store.commit('increment') // 任何由'increment'导致的状态变更都应该在此刻完成

需求:点击不同的音乐列表就让下方播放列表显示自己点击的列表,音乐列表是循环的


实现方式:就是利用vuex中的mutations。在mutations中定义一个方法,这个方法就是把点击的index(也就是每个列表的唯一标识),传给state中的当前标识。在循环列表的页面,把setPlayIndex方法引用过来用到页面中,点击不同的列表传不同的index也就是setPlayIndex方法中的不同的value。

Vuex中mutations的用法相关推荐

  1. 【手写 Vuex 源码】第五篇 - Vuex 中 Mutations 和 Actions 的实现

    一,前言 上一篇,主要介绍了 Vuex 中 getters 的实现,主要涉及以下几个点: 将选项中的 getters 方法,保存到 store 实例中的 getters 对象中: 借助 Vue 原生 ...

  2. Vuex中mutations与actions的区别与用法

    一.区别 操作 描述 mutations 一般用于方法同步调用,修改vuex中state的状态. actions 一般用于方法异步调用,多用于请求后台接口. 注:mutations 同步操作,不能写异 ...

  3. vuex中mutations数据响应

    vuex中的mutation需遵守Vue的响应规则: 既然Vuex的store中的状态是响应式的,那么在我们变更状态时,监视状态的Vuex最好在state中初始化好所有的所需属性. 如果需要在对象上添 ...

  4. 一位面试者提到直接调用vuex中mutations方法

    简述是用this.$store.mutations.xxx(xx)方式调用,因从未见过此种调用方式,回来就搜索了一下,查询结果如下 首先前文: 获取 state 的方式有两种,分别是 this.$st ...

  5. Vuex中mapState的用法

    今天遇到一个吭,最后使用vue mapState得以解决. 之前有说过使用mapState语法糖,在这里直接用computed返回竟然不行.然后在官网有看到相关说明:进入官网. 下面介绍一下mapSt ...

  6. vuex的mutations

    vuex 的严格模式strict: true下,不允许组件修改state中的值,若需要修改,在vuex的mutations属性中进行修改. 注意:只能在mutations下的函数进行修改,如果muta ...

  7. vuex基础mutations和actions

    state数据的修改只能通过mutations,并且mutations必须是同步更新,目的是形成`数据快照` 数据快照:一次mutation的执行,**立刻**得到一种视图状态,因为是立刻,所以必须是 ...

  8. vue之mapMutaions的使用 vuex中 action 用法示例 api.js的使用

    vue之mapMutations的使用 我们通过Mutation来改变store中的state,方法往往是在子组件中使用 this.$store.commit(); 来实现,但是这样的缺点是不容易查看 ...

  9. mutations vuex 调用_Vuex中mutations和actions的区别

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化 Mutation 更改 Vuex 的 sto ...

最新文章

  1. 单机 “5千万以上“ 工业级 LRU cache 实现
  2. java request 原理_JavaWeb-seession原理
  3. 一文了解OOM及解决方案
  4. 千灯腾碧人潮涌,蓬勃“雨花”气如虹
  5. ASA IPSEC ***配置
  6. Python之深入解析如何制作国际空间站实时跟踪器
  7. ASP.NET Google Maps Javascript API V3 实战基础篇一获取和设置事件处理程序中的属性...
  8. altium pcb 信号高亮_在PCB设计中高效的放置元件技巧
  9. unoconv执行出错unable to connect or start own listener
  10. 基于JAVA+SpringBoot+Mybatis+MYSQL的企业考勤管理系统
  11. 在SAE搭建微信公众账号服务
  12. python重定向网页_【Python网页分析】httplib库的重定向处理
  13. 微信小程序之验证码短信倒计时
  14. 使用.net做微信公众号后台
  15. 第三届全国平面公益广告大赛暨全国大学生公益广告征集活动
  16. yum源及常用安装包整理
  17. 初识MIMO(六):MU-MIMO的仿真
  18. C语言计算一元二次方程的根(完全版)
  19. 【山外笔记-工具框架】SVN版本控制系统
  20. 连接池中溺死重生,多亏NET 连接池救生员

热门文章

  1. 阿里云CPU性能Intel Xeon(Sapphire Rapids) Platinum 8475B
  2. switch case 、循环结构
  3. ubuntu安装Miniconda
  4. greedy approach
  5. ubuntu mutt发送邮件
  6. 中文及英文词云的制作
  7. 阿里巴巴2010校园招聘技术类笔试试题
  8. 百度富文本编辑器UEditor 图片宽度100%自适应,手机端
  9. 女生学大数据的就业方向好不好就业
  10. Jetson TX2 上安装Pycharm