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 相关文章推荐
jMessageBox 基于jQuery的窗口插件
Dec 09 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
Jun 29 Javascript
javascript 3d 逐侦产品展示(核心精简)
Mar 26 Javascript
原生js和jquery实现图片轮播特效
Apr 23 Javascript
Easyui form combobox省市区三级联动
Jan 13 Javascript
Bootstrap carousel轮转图的使用实例详解
May 17 Javascript
javascript删除html标签函数cIsHTML
Jan 09 Javascript
详解angular ui-grid之过滤器设置
Jun 07 Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
Oct 25 Javascript
JS实现键值对遍历json数组功能示例
May 30 Javascript
在react-antd中弹出层form内容传递给父组件的操作
Oct 24 Javascript
elementUI同一页面展示多个Dialog的实现
Nov 19 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
PHP4 与 MySQL 数据库操作函数详解
2006/12/06 PHP
Yii视图操作之自定义分页实现方法
2016/07/14 PHP
javascript中&quot;/&quot;运算符常见错误
2010/10/13 Javascript
jquery判断checkbox(复选框)是否被选中的代码
2010/10/20 Javascript
jQuery操作Select选择的Text和Value(获取/设置/添加/删除)
2013/03/06 Javascript
JS小功能(setInterval实现图片效果显示时间)实例代码
2013/11/28 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
2015/03/24 Javascript
使用Jquery实现每日签到功能
2015/04/03 Javascript
浅析javascript中的Event事件
2016/12/09 Javascript
JQuery和HTML5 Canvas实现弹幕效果
2017/01/04 Javascript
js自定义QQ菜单效果
2017/01/10 Javascript
VUE长按事件需求详解
2017/10/18 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
2018/02/05 Javascript
在Vue项目中引入腾讯验证码服务的教程
2018/04/03 Javascript
JS实现用特殊符号替换字符串的中间部分区域的实例代码
2018/07/24 Javascript
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
python判断端口是否打开的实现代码
2013/02/10 Python
分享Python字符串关键点
2015/12/13 Python
Python工程师面试题 与Python Web相关
2016/01/14 Python
Python基于Matplotlib库简单绘制折线图的方法示例
2017/08/14 Python
Python之读取TXT文件的方法小结
2018/04/27 Python
python模糊图片过滤的方法
2018/12/14 Python
Python多叉树的构造及取出节点数据(treelib)的方法
2019/08/09 Python
python数据处理之如何选取csv文件中某几行的数据
2019/09/02 Python
Pytorch提取模型特征向量保存至csv的例子
2020/01/03 Python
Python爬虫后获取重定向url的两种方法
2021/01/19 Python
丹麦优惠购物网站:PLUSSHOP
2019/03/24 全球购物
农救科工作职责
2013/11/27 职场文书
战友聚会邀请函
2014/01/18 职场文书
公司募捐倡议书
2014/05/14 职场文书
银行反四风对照检查材料
2014/09/29 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
疑《守望先锋2》A测截图泄露 或将推出新模式、新界面
2022/04/03 其他游戏
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL