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实现N皇后问题算法谜题解答
Dec 29 Javascript
jQuery实现图片左右滚动特效
Apr 20 Javascript
javascript学习总结之js使用技巧
Sep 02 Javascript
js操作XML文件的实现方法兼容IE与FireFox
Jun 25 Javascript
Bootstrap Table使用方法详解
Aug 01 Javascript
BOM系列第二篇之定时器requestAnimationFrame
Aug 17 Javascript
完美解决IE9浏览器出现的对象未定义问题
Sep 29 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
Oct 25 Javascript
微信小程序配置服务器提示验证token失败的解决方法
Apr 03 Javascript
vue移动端城市三级联动组件使用详解
Jul 26 Javascript
Vue路由守卫及页面登录权限控制的设置方法(两种)
Mar 31 Javascript
JS实现可以用键盘方向键控制的动画
Dec 11 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读取TXT文件向数据库导入海量数据的方法
2013/04/23 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
2014/07/10 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
PHP配置ZendOpcache插件加速
2019/02/14 PHP
Centos7 Yum安装PHP7.2流程教程详解
2019/07/02 PHP
静态的动态续篇之来点XML
2006/12/23 Javascript
用JQuery实现表格隔行变色和突出显示当前行的代码
2012/02/10 Javascript
公共js在页面底部加载的注意事项介绍
2013/07/18 Javascript
js函数定时器实现定时读取系统实时连接数
2014/04/30 Javascript
非常酷炫的Bootstrap图片轮播动画
2016/05/27 Javascript
支持移动端原生js轮播图
2017/02/16 Javascript
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
详解如何实现一个简单的 vuex
2018/02/10 Javascript
JavaScript ES6箭头函数使用指南
2018/12/30 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
2019/03/07 Javascript
vue中实现弹出层动画效果的示例代码
2020/09/25 Javascript
一篇文章让你搞懂JavaScript 原型和原型链
2020/11/23 Javascript
[44:51]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第二场
2018/04/05 DOTA
简单的通用表达式求10乘阶示例
2014/03/03 Python
Python中使用 Selenium 实现网页截图实例
2014/07/18 Python
Python lambda和Python def区别分析
2014/11/30 Python
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
实例解析Python的Twisted框架中Deferred对象的用法
2016/05/25 Python
Python Paramiko模块的安装与使用详解
2016/11/18 Python
django2用iframe标签完成网页内嵌播放b站视频功能
2018/06/20 Python
python中的插值 scipy-interp的实现代码
2018/07/23 Python
Pycharm配置远程调试的方法步骤
2018/12/17 Python
使用pandas的box_plot去除异常值
2019/12/10 Python
Django多个app urls配置代码实例
2020/11/26 Python
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
伦敦剧院门票:London Theatre Direct
2018/11/21 全球购物
外贸业务员岗位职责
2013/11/24 职场文书
财务会计人员岗位职责
2013/11/30 职场文书
初中音乐教学反思
2014/01/12 职场文书
大学生求职自荐信范文
2015/03/04 职场文书
销售员自我评价
2015/03/11 职场文书