热门标签 | 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)
      }
      }
      }


    推荐阅读
    • vue使用
      关键词: ... [详细]
    • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
    • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
    • 浏览器中的异常检测算法及其在深度学习中的应用
      本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
    • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
    • Webpack5内置处理图片资源的配置方法
      本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
    • Java序列化对象传给PHP的方法及原理解析
      本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
    • 本文讨论了为什么在main.js中写import不会全局生效的问题,并提供了解决方案。在每一个vue文件中都需要写import语句才能使其生效,而在main.js中写import语句则不会全局生效。本文还介绍了使用Swal和sweetalert2库的示例。 ... [详细]
    • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
    • Voicewo在线语音识别转换jQuery插件的特点和示例
      本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
    • PHP中的单例模式与静态变量的区别及使用方法
      本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
    • 本文介绍了在使用vue和webpack进行异步组件按需加载时可能出现的报错问题,并提供了解决方法。同时还解答了关于局部注册组件和v-if指令的相关问题。 ... [详细]
    • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
    • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
      本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
    • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
    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社区 版权所有