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 相关文章推荐
javascript模仿msgbox提示效果代码
Jun 10 Javascript
javascript web页面刷新的方法收集
Jul 02 Javascript
JavaScript 序列化对象实现代码
Dec 18 Javascript
有关于JS辅助函数inherit()的问题
Apr 07 Javascript
JSON传递bool类型数据的处理方式介绍
Sep 18 Javascript
javascript轻量级模板引擎juicer使用指南
Jun 22 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
Nov 12 Javascript
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
May 21 Javascript
vue中echarts引入中国地图的案例
Jul 28 Javascript
javascript canvas实现简易时钟例子
Sep 05 Javascript
小程序自定义弹框效果
Nov 16 Javascript
node.js通过Sequelize 连接MySQL的方法
Dec 28 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
星际争霸秘籍
2020/03/04 星际争霸
fleaphp常用方法分页之Pager使用方法
2011/04/23 PHP
PHP面向对象之后期静态绑定功能介绍
2015/05/18 PHP
分享10段PHP常用代码
2015/11/11 PHP
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
基于JQuery的Select选择框的华丽变身
2011/08/23 Javascript
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
2012/04/14 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
解决jquery操作checkbox火狐下第二次无法勾选问题
2014/02/10 Javascript
完美兼容各大浏览器获取HTTP_REFERER方法总结
2014/06/24 Javascript
JQuery自动触发事件的方法
2015/06/13 Javascript
jQuery ajax提交Form表单实例(附demo源码)
2016/04/06 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
js实现网页定位导航功能
2017/03/07 Javascript
Webpack 之 babel-loader文件预处理器详解
2018/03/23 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
bootstrap datepicker的基本使用教程
2019/07/09 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
2019/08/01 Javascript
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
vue项目中极验验证的使用代码示例
2019/12/03 Javascript
Python使用gensim计算文档相似性
2016/04/10 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
NumPy 数学函数及代数运算的实现代码
2018/07/18 Python
Python 按字典dict的键排序,并取出相应的键值放于list中的实例
2019/02/12 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
python从ftp获取文件并下载到本地
2020/12/05 Python
Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作
2021/03/03 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
CSS3打造磨砂玻璃背景效果
2016/09/28 HTML / CSS
艺术专业大学生自我评价
2013/09/22 职场文书
新三好学生主要事迹
2014/01/23 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
催款函范本大全
2015/06/24 职场文书
春季运动会加油词
2015/07/18 职场文书
经销商会议开幕词
2016/03/04 职场文书