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 相关文章推荐
基于jquery的一个浮动框(扩展性比较好 )
Aug 27 Javascript
javascript作用域容易记错的两个地方分析
Jun 22 Javascript
jquery选择器大全 全面详解jquery选择器
Mar 06 Javascript
checkbox勾选判断代码分析
Jun 11 Javascript
javascript学习笔记(四)function函数部分
Sep 30 Javascript
jQuery简单实现图片预加载
Apr 20 Javascript
jquery实现简单的自动播放幻灯片效果
Jun 13 Javascript
微信小程序开发(二)图片上传+服务端接收详解
Jan 11 Javascript
vue-router:嵌套路由的使用方法
Feb 21 Javascript
利用js的闭包原理做对象封装及调用方法
Apr 07 Javascript
如何在 ant 的table中实现图片的渲染操作
Oct 28 Javascript
js canvas实现五子棋小游戏
Jan 22 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创建PDF中文文档
2006/10/09 PHP
自动生成文章摘要的代码[PHP 版本]
2007/03/20 PHP
PHP中基本符号及使用方法
2010/03/23 PHP
php中设置多级目录session的问题
2011/08/08 PHP
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
2014/06/30 PHP
php查询相似度最高的字符串的方法
2015/03/12 PHP
php 策略模式原理与应用深入理解
2019/09/25 PHP
js鼠标滑过弹出层的定位IE6bug解决办法
2012/12/26 Javascript
jquery 多行文本框(textarea)高度变化
2013/07/03 Javascript
JavaScript中数据结构与算法(二):队列
2015/06/19 Javascript
jquery悬浮提示框完整实例
2016/01/13 Javascript
超链接怎么正确调用javascript函数
2016/05/23 Javascript
AngularJS变量及过滤器Filter用法分析
2016/11/22 Javascript
Bootstrap基本组件学习笔记之导航(10)
2016/12/07 Javascript
javascript简单链式调用案例分析
2017/05/10 Javascript
bootstrap timepicker在angular中取值并转化为时间戳
2017/06/13 Javascript
详解webpack babel的配置
2018/01/09 Javascript
webpack打包非模块化js的方法
2018/10/24 Javascript
Vue仿微信app页面跳转动画效果
2019/08/21 Javascript
微信小程序如何加载数据库真实数据的实现
2020/03/04 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
用python分割TXT文件成4K的TXT文件
2009/05/23 Python
numpy自动生成数组详解
2017/12/15 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
2018/10/11 Python
Python3 itchat实现微信定时发送群消息的实例代码
2019/07/12 Python
python定义类self用法实例解析
2020/01/22 Python
tensorflow自定义激活函数实例
2020/02/04 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
快速实现一个简单的canvas迷宫游戏的示例
2018/07/04 HTML / CSS
西班牙拥有最佳品牌的动物商店:Animalear.com
2018/01/05 全球购物
流行文化收藏品:Sideshow(DC漫画,星球大战,漫威)
2019/03/17 全球购物
农村婚礼证婚词
2014/01/10 职场文书
秋收起义观后感
2015/06/11 职场文书
高一作文之暖冬
2019/11/09 职场文书