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的动态表格插件
Mar 28 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
Apr 08 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
Apr 16 Javascript
js获取隐藏元素宽高的实现方法
May 19 Javascript
微信小程序使用第三方库Underscore.js步骤详解
Sep 27 Javascript
windows下更新npm和node的方法
Nov 30 Javascript
jquery实现选项卡切换代码实例
May 14 jQuery
实现一个 Vue 吸顶锚点组件方法
Jul 10 Javascript
Vue修改项目启动端口号方法
Nov 07 Javascript
Websocket 向指定用户发消息的方法
Jan 09 Javascript
vue-router定义元信息meta操作
Dec 07 Vue.js
vue-router懒加载的3种方式汇总
Feb 28 Vue.js
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
一个查看session内容的函数
2006/10/09 PHP
php入门学习知识点三 PHP上传
2011/07/14 PHP
PHP callback函数使用方法和注意事项
2015/01/23 PHP
PHP简单读取xml文件的方法示例
2017/04/20 PHP
PHP 代码简洁之道(小结)
2019/10/16 PHP
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
为JavaScript添加重载函数的辅助方法
2010/07/04 Javascript
JavaScript 放大镜 放大倍率和视窗尺寸
2011/05/09 Javascript
JQuery对checkbox操作 (循环获取)
2011/05/20 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
详解AngularJS中的表格使用
2015/06/16 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
2016/01/08 Javascript
JS DOMReady事件的六种实现方法总结
2016/11/23 Javascript
微信小程序 底部导航栏目开发资料
2016/12/05 Javascript
浅谈Nodejs中的作用域问题
2016/12/26 NodeJs
vue+webpack实现异步加载三种用法示例详解
2018/04/24 Javascript
Express之托管静态文件的方法
2018/06/01 Javascript
NodeJS 文件夹拷贝以及删除功能
2019/09/03 NodeJs
vue 中的 render 函数作用详解
2020/02/28 Javascript
vue中渲染对象中属性时显示未定义的解决
2020/07/31 Javascript
深入解析Python中的list列表及其切片和迭代操作
2016/03/13 Python
Python3导入自定义模块的三种方法详解
2018/04/13 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
python中watchdog文件监控与检测上传功能
2020/10/30 Python
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
教师评优的个人自我评价分享
2013/09/19 职场文书
周年庆典邀请函范文
2014/01/23 职场文书
《找不到快乐的波斯猫》教学反思
2014/02/24 职场文书
2014小学植树节活动总结
2014/03/10 职场文书
购房意向书
2014/04/01 职场文书
经典团队口号大全
2014/06/21 职场文书
学生检讨书范文
2014/10/30 职场文书
坎儿井导游词
2015/02/09 职场文书
教师继续教育反思周记
2015/06/25 职场文书
Mysql官方性能测试工具mysqlslap的使用简介
2021/05/21 MySQL
JS实现简单的九宫格抽奖
2022/06/28 Javascript