Vuex之理解Mutations的用法实例


Posted in Javascript onApril 19, 2017

1.什么是mutations?

上一篇文章说的getters是为了初步获取和简单处理state里面的数据(这里的简单处理不能改变state里面的数据),Vue的视图是由数据驱动的,也就是说state里面的数据是动态变化的,那么怎么改变呢,切记在Vuexstore数据改变的唯一方法就是mutation

通俗的理解mutations,里面装着一些改变数据方法的集合,这是Veux设计很重要的一点,就是把处理数据逻辑方法全部放在mutations里面,使得数据和视图分离。

2.怎么用mutations?

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

const store = new Vuex.Store({
  state: {
    count: 1
    },
  mutations: {
  increment (state) {   //注册时间,type:increment,handler第一个参数是state;
     // 变更状态
    state.count++}}})
    
  store.commit('increment')  //调用type,触发handler(state)

载荷(payload):简单的理解就是往handler(stage)中传参handler(stage,pryload);一般是个对象。

mutations: {
 increment (state, n) {
   state.count += n}}
 store.commit('increment', 10)
mutation-types:将常量放在单独的文件中,方便协作开发。
  // mutation-types.js
 export const SOME_MUTATION = 'SOME_MUTATION'
  // 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
 }
}
})

commit:提交可以在组件中使用 this.$store.commit('xxx') 提交 mutation,或者使用 mapMutations 辅助函数将组件中的 methods 映射为 store.commit 调用(需要在根节点注入 store)。

import { mapMutations } from 'vuex'

export default {

methods: {
 ...mapMutations([
  'increment' // 映射 this.increment() 为 
this.$store.commit('increment')]),
 ...mapMutations({
  add: 'increment' // 映射 this.add() 为 
this.$store.commit('increment')
 })}}

3.源码分析

registerMutation:初始化mutation

function registerMutation (store, type, handler, path = []) {
 //4个参数,store是Store实例,type为mutation的type,handler,path为当前模块路径
  const entry = store._mutations[type] || (store._mutations[type] = 
[]) //通过type拿到对应的mutation对象数组
   entry.push(function wrappedMutationHandler (payload) {
   //将mutation包装成函数push到数组中,同时添加载荷payload参数  
   handler(getNestedState(store.state, path), payload)
   //通过getNestedState()得到当前的state,同时添加载荷payload参数
  })
 }

commit:调用mutation

commit (type, payload, options) {
 // 3个参数,type是mutation类型,payload载荷,options配置
  if (isObject(type) && type.type) {
    // 当type为object类型,
   options = payload
   payload = type
   type = type.type
 }
 const mutation = { type, payload }
 const entry = this._mutations[type]
  // 通过type查找对应的mutation
 if (!entry) {
 //找不到报错
  console.error(`[vuex] unknown mutation type: ${type}`)
  return
 }
 this._withCommit(() => {
  entry.forEach(function commitIterator (handler) {
  // 遍历type对应的mutation对象数组,执行handle(payload)方法
  //也就是开始执行wrappedMutationHandler(handler)
   handler(payload)
  })
 })
 if (!options || !options.silent) {
  this._subscribers.forEach(sub => sub(mutation, this.state))
  //把mutation和根state作为参数传入
 }
}

subscribers:订阅storemutation

subscribe (fn) {
const subs = this._subscribers
if (subs.indexOf(fn) < 0) {
 subs.push(fn)
 }
return () => {
 const i = subs.indexOf(fn)
 if (i > -1) {
  subs.splice(i, 1)
  }
 }
 }

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
SWFObject Flash js调用类
Jul 08 Javascript
JavaScript 组件之旅(三):用 Ant 构建组件
Oct 28 Javascript
Jquery+JSon 无刷新分页实现代码
Apr 01 Javascript
关于document.cookie的使用javascript
Oct 29 Javascript
7个有用的jQuery代码片段分享
May 19 Javascript
jQuery实现简单的点赞效果
May 29 Javascript
Javascript获取统一管理的提示语(message)
Feb 03 Javascript
AngularJS基础 ng-readonly 指令简单示例
Aug 02 Javascript
AngularJS教程之简单应用程序示例
Aug 16 Javascript
Ajax使用原生态JS验证用户名是否存在
May 26 Javascript
详解JavaScript按概率随机生成事件
Aug 02 Javascript
js匿名函数使用&amp;传参(实例)
Sep 08 Javascript
Vuex之理解Getters的用法实例
Apr 19 #Javascript
Vuex之理解state的用法实例
Apr 19 #Javascript
微信小程序 聊天室简单实现
Apr 19 #Javascript
Vuex之理解Store的用法
Apr 19 #Javascript
微信小程序 判断手机号的实现代码
Apr 19 #Javascript
Vuex简单入门
Apr 19 #Javascript
微信小程序 滚动到某个位置添加class效果实现代码
Apr 19 #Javascript
You might like
php利用header函数实现文件下载时直接提示保存
2009/11/12 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
js 分页全选或反选标识实现代码
2011/08/09 Javascript
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
javascript事件模型实例分析
2015/01/30 Javascript
分享9点个人认为比较重要的javascript 编程技巧
2015/04/27 Javascript
Javascript实现可旋转的圆圈实例代码
2015/08/04 Javascript
基于JavaScript实现div层跟随滚动条滑动
2016/01/12 Javascript
简单分析javascript中的函数
2016/09/10 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
AngularJS实现表单验证功能详解
2017/10/12 Javascript
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
2017/11/27 Javascript
vue中使用axios post上传头像/图片并实时显示到页面的方法
2018/09/27 Javascript
vue和iview实现Scroll 数据无限滚动功能
2019/10/31 Javascript
VUEX采坑之路之获取不到$store的解决方法
2019/11/08 Javascript
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
[01:24:34]2014 DOTA2华西杯精英邀请赛5 24 DK VS LGD
2014/05/25 DOTA
Python内置数据结构与操作符的练习题集锦
2016/07/01 Python
Python中的上下文管理器和with语句的使用
2018/04/17 Python
Python 实现自动导入缺失的库
2019/10/29 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
2020/06/17 Python
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
2018/09/10 HTML / CSS
H5 canvas实现贪吃蛇小游戏
2017/07/28 HTML / CSS
canvas进阶之如何画出平滑的曲线
2018/10/15 HTML / CSS
Bose法国官网:购买耳机、扬声器、家庭影院、专业音响
2017/12/21 全球购物
加拿大户外探险购物网站:SAIL
2020/06/27 全球购物
linux面试题参考答案(4)
2014/09/21 面试题
电大毕业生自我鉴定
2013/11/10 职场文书
大学生职业生涯规划范文——找准自我,定位人生
2014/01/23 职场文书
如何编写优秀的食品项目创业计划书
2014/01/23 职场文书
关于读书的演讲稿600字
2014/08/27 职场文书
安全保证书
2015/01/16 职场文书
教师学习十八届五中全会精神心得体会
2016/01/05 职场文书
多表查询、事务、DCL
2021/04/05 MySQL
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
MySQL中B树索引和B+树索引的区别详解
2022/03/03 MySQL