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 相关文章推荐
在视频前插入广告
Nov 20 Javascript
不用写JS也能使用EXTJS视频演示
Dec 29 Javascript
禁止ajax缓存获取程序最新数据的方法
Nov 19 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
Jul 05 Javascript
浅谈javascript中的DOM方法
Jul 16 Javascript
使用postMesssage()实现跨域iframe页面间的信息传递方法
Mar 29 Javascript
基于JQuery打造无缝滚动新闻步骤详解
Mar 31 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
Jun 28 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
May 13 jQuery
JavaScript中如何调用Java方法
Sep 16 Javascript
jQuery zTree如何改变指定节点文本样式
Oct 16 jQuery
vue导入.md文件的步骤(markdown转HTML)
Dec 31 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
攻克CakePHP系列三 表单数据增删改
2008/10/22 PHP
ThinkPHP模板替换与系统常量及应用实例教程
2014/08/22 PHP
Apache启动报错No space left on device: AH00023该怎么解决
2015/10/16 PHP
laravel实现简单用户权限的示例代码
2019/05/28 PHP
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
js实现右下角可关闭最小化div(可用于展示推荐内容)
2013/06/24 Javascript
js编码、解码函数介绍及其使用示例
2013/09/05 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
jquery模拟进度条实现方法
2015/08/03 Javascript
JavaScript关于提高网站性能的几点建议(一)
2016/07/24 Javascript
js实现可旋转的立方体模型
2016/10/16 Javascript
详解Node.js中exports和module.exports的区别
2017/04/19 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
2018/08/20 Javascript
微信小程序实现简单评论功能
2018/11/28 Javascript
NodeJs实现简单的爬虫功能案例分析
2018/12/05 NodeJs
微信小程序使用npm包的方法步骤
2019/08/13 Javascript
Vue实现兄弟组件间的联动效果
2020/01/21 Javascript
JS如何在数组指定位置插入元素
2020/03/10 Javascript
深入了解Vue动态组件和异步组件
2021/01/26 Vue.js
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
[57:16]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第二场
2014/05/26 DOTA
Windows系统配置python脚本开机启动的3种方法分享
2015/03/10 Python
python使用socket向客户端发送数据的方法
2015/04/29 Python
关于python列表增加元素的三种操作方法
2018/08/22 Python
Puppeteer使用示例详解
2019/06/20 Python
对Django 中request.get和request.post的区别详解
2019/08/12 Python
Python实现打印实心和空心菱形
2019/11/23 Python
python利用JMeter测试Tornado的多线程
2020/01/12 Python
Numpy中的数组搜索中np.where方法详细介绍
2021/01/08 Python
ECCO爱步美国官网:来自丹麦的鞋履品牌
2016/11/23 全球购物
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
你经历的项目中的SCM配置项主要有哪些?什么是配置项?
2013/11/04 面试题
技术员岗位职责范本
2015/04/11 职场文书
运动会5000米加油稿
2015/07/21 职场文书