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 相关文章推荐
浏览器无法运行JAVA脚本的解决方法
Jan 09 Javascript
JS 打印功能代码可实现打印预览、打印设置等
Oct 31 Javascript
深入分析jquery解析json数据
Dec 09 Javascript
js实现发送验证码后的倒计时功能
May 28 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
May 17 Javascript
微信小程序 利用css实现遮罩效果实例详解
Jan 21 Javascript
从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例
Apr 13 Javascript
浅谈react.js 之 批量添加与删除功能
Apr 17 Javascript
详解Vue3.0 前的 TypeScript 最佳入门实践
Jun 18 Javascript
Angular6项目打包优化的实现方法
Dec 15 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
Feb 06 Javascript
vue props 一次传多个值实例
Jul 22 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初学者的8点有效建议
2010/11/20 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
PHP快速排序算法实现的原理及代码详解
2019/04/03 PHP
php array 转json及java 转换 json数据格式操作示例
2019/11/13 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
php如何获取Http请求
2020/04/30 PHP
JavaScript中的私有成员
2006/09/18 Javascript
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
常用jQuery代码分享
2015/07/14 Javascript
knockoutjs动态加载外部的file作为component中的template数据源的实现方法
2016/09/01 Javascript
jstree单选功能的实现方法
2017/06/07 Javascript
js弹性势能动画之抛物线运动实例详解
2017/07/27 Javascript
基于ES6作用域和解构赋值详解
2017/11/03 Javascript
JS实现碰撞检测的方法分析
2018/01/19 Javascript
Vue.js中对css的操作(修改)具体方式详解
2018/10/30 Javascript
vue实现自定义日期组件功能的实例代码
2018/11/06 Javascript
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
[02:16]完美世界DOTA2联赛PWL S3 集锦第三期
2020/12/21 DOTA
python多进程操作实例
2014/11/21 Python
详解Python在七牛云平台的应用(一)
2017/12/05 Python
python实现flappy bird游戏
2018/12/24 Python
树莓派极简安装OpenCv的方法步骤
2019/10/10 Python
python3下pygame如何实现显示中文
2020/01/11 Python
matplotlib 对坐标的控制,加图例注释的操作
2020/04/17 Python
Keds官方网站:购买帆布运动鞋和经典皮鞋
2016/11/12 全球购物
Bibloo罗马尼亚网站:女装、男装、童装及鞋子和配饰
2019/07/20 全球购物
JAVA高级程序员面试题
2013/09/06 面试题
与UNIX有关的几个名词
2015/09/17 面试题
党组织公开承诺书
2014/03/29 职场文书
《第一朵杏花》教学反思
2014/04/16 职场文书
小学数学教学经验交流材料
2014/05/22 职场文书
加强作风建设心得体会
2014/10/22 职场文书
建议书格式
2015/02/04 职场文书
房租涨价通知
2015/04/23 职场文书
美丽人生观后感
2015/06/03 职场文书
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers