热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Vuex之理解Mutations

理解Mutations1.什么是mutations?上一篇文章说的getters是为了初步获取和简单处理state里面的数据(这里的简单处理不能改变state里面的数据),Vue的

理解Mutations

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)
      }
      }
      }


    推荐阅读
    • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
    • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
    • Webpack 初探:Import 和 Require 的使用
      本文介绍了 Webpack 中 Import 和 Require 的基本概念和使用方法,帮助读者更好地理解和应用模块化开发。 ... [详细]
    • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
    • Spring – Bean Life Cycle
      Spring – Bean Life Cycle ... [详细]
    • 在分析Android的Audio系统时,我们对mpAudioPolicy->get_input进行了详细探讨,发现其背后涉及的机制相当复杂。本文将详细介绍这一过程及其背后的实现细节。 ... [详细]
    • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
    • 重要知识点有:函数参数默许值、盈余参数、扩大运算符、new.target属性、块级函数、箭头函数以及尾挪用优化《深切明白ES6》笔记目次函数的默许参数在ES5中,我们给函数传参数, ... [详细]
    • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
      字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
    • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
    • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
    • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
    • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
    • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
    • Spring框架的核心组件与架构解析 ... [详细]
    author-avatar
    077是个好姑娘
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有