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 相关文章推荐
使用prototype.js进行异步操作
Feb 07 Javascript
javascript 触发HTML元素绑定的函数
Sep 11 Javascript
推荐30个新鲜出炉的精美 jQuery 效果
Mar 26 Javascript
Jquery使用val方法读写value值
May 18 Javascript
jQuery联动日历的实例解析
Dec 02 Javascript
JS基于面向对象实现的选项卡效果示例
Dec 20 Javascript
Bootstrap fileinput文件上传预览插件使用详解
May 16 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
Dec 28 Javascript
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
Feb 20 Javascript
用Vue.js方法创建模板并使用多个模板合成
Jun 28 Javascript
浅谈Vue使用Elementui修改默认的最快方法
Dec 05 Vue.js
(开源)微信小程序+mqtt,esp8266温湿度读取
Apr 02 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
《猛禽小队》:DC宇宙的又一超级大烂片
2020/04/09 欧美动漫
php empty() 检查一个变量是否为空
2011/11/10 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
centos7上编译安装php7以php-fpm方式连接apache
2018/11/08 PHP
Thinkphp整合阿里云OSS图片上传实例代码
2019/04/28 PHP
JavaScript DOM 学习第二章 编辑文本
2010/02/19 Javascript
javascript 二分法(数组array)
2010/04/24 Javascript
原生javascript实现无间缝滚动示例
2014/01/28 Javascript
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
js实现的点击div区域外隐藏div区域
2014/06/30 Javascript
JavaScript正则表达式匹配 div  style标签
2016/03/15 Javascript
JS简单实现表格排序功能示例
2016/12/20 Javascript
Bootstrap下拉菜单Dropdowns的实现代码
2017/03/17 Javascript
vue中引入mxGraph的步骤详解
2019/05/17 Javascript
JS/jQuery实现超简单的Table表格添加,删除行功能示例
2019/07/31 jQuery
前端vue-cli项目中使用img图片和background背景图的几种方法
2019/11/13 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
零基础写python爬虫之抓取糗事百科代码分享
2014/11/06 Python
使用Python神器对付12306变态验证码
2016/01/05 Python
Python 内置函数memoryview(obj)的具体用法
2017/11/23 Python
Django入门使用示例
2017/12/12 Python
pandas全表查询定位某个值所在行列的方法
2018/04/12 Python
python print 按逗号或空格分隔的方法
2018/05/02 Python
Pandas透视表(pivot_table)详解
2019/07/22 Python
python正则表达式匹配不包含某几个字符的字符串方法
2019/07/23 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
2020/04/13 Python
使用Python实现批量ping操作方法
2020/05/06 Python
python文件操作seek()偏移量,读取指正到指定位置操作
2020/07/05 Python
J.Crew官网:美国知名休闲服装品牌
2017/05/19 全球购物
华为消费者德国官方网站:HUAWEI德国
2020/11/03 全球购物
应届毕业生个人自我评价
2013/09/20 职场文书
清明节扫墓活动方案
2014/03/02 职场文书
家长会主持词
2014/03/26 职场文书
文明社区申报材料
2014/08/21 职场文书
小学校长个人总结
2015/03/03 职场文书
Docker容器harbor私有仓库部署和管理
2022/08/05 Servers