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

vuex源码分析(六)辅助函数详解

对于state、getter、mutation、action来说,如果每次使用的时候都用this.$store.state、this.$store.getter等引用,会比较麻烦,

对于state、getter、mutation、action来说,如果每次使用的时候都用this.$store.state、this.$store.getter等引用,会比较麻烦,代码也重复和冗余,我们可以用辅助函数来帮助我们生成要的代码,辅助函数有如下四个:

    mapState(namespace, map)        ;用于获取state
    mapGetters(namespace, map)       ;用于获取getters
    mapMutations(namespace, map)      ;用于获取mutations
    mapActions(namespace, map)          ;用于获取actions

每个辅助函数都可以带两个参数:

  namespace     ;命名空间,也就是模块名

  map       ;要获取的信息

map有两种用法,可以是对象(键名是当前Vue实例设置的变量名,值是从store要获取的变量名)或者字符串数组(此时获取和设置的变量名为同一个)。

注:使用辅助函数需要在根节点注入store

ps:很多新手可能只会使用辅助函数,不知道还可以用this.$store.state,this.$store.getter这些用法...

这些辅助函数返回的都是一个对象,我们可以配合ES6的对象展开运算符,我们可以极大地简化写法,例如:

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Documenttitle>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js">script>
    <script src="https://unpkg.com/vuex@3.1.0/dist/vuex.js">script>
head>
<body>
    <div id="app">
        <p>{{no}}p>
        <p>{{No}}p>
        <button @click="test1">测试1button>
        <button @click="test2">测试2button>
    div>
    <script>
        const store = new Vuex.Store({
            state:{no:100},
            getters:{
                No:function(state){return state.no+100}
            },
            mutations:{
                increment(state,payload){state.no+=payload.no;}
            },
            actions:{
                increment({commit},info){
                    setTimeout(function(){
                        commit('increment',info)
                    },500)
                }
            }
        })
        var app = new Vue({
            el:"#app",
            store,
            computed:{
                ...Vuex.mapState(['no']),
                ...Vuex.mapGetters(['No'])
            },
            methods:{
                ...Vuex.mapMutations(['increment']),
                ...Vuex.mapActions({increment1:"increment"}),
                test1(){
                    this.increment({no:100})
                },
                test2(){
                    this.increment1({no:200})
                }
            }
        })  
    script>
body>
html>

writer by:大沙漠 QQ:22969969

我觉得吧,如果用到的vuex里的属性比较多还好一点,如果只用到一个state还不如用this.$store.state来获取呢,毕竟在node环境下还需要import{mapState} from 'vuex'来获取导出的符号,可以看页面具体的需求选择合理的方法。

 

源码分析


 vuex内的所有辅助函数格式都一样,都是执行一个normalizeNamespace()函数,并传入一个匿名函数,该匿名函数带有两个参数,分别是namespace和map,以mapState为例,如下:

var mapState = normalizeNamespace(function (namespace, states) {        //state辅助函数 name:命名空间 states:比如:count2: "count"
  var res = {};
  normalizeMap(states).forEach(function (ref) {                             //将states转换为对象格式,例如:[{key:count2,val:count}]
    var key = ref.key;
    var val = ref.val;

    res[key] = function mappedState () {                                      //计算属性对应的是一个函数,该函数内的this指向的是Vue实例
      var state = this.$store.state;                                              //获取state对象
      var getters = this.$store.getters;                                          //获取getters对象
      if (namespace) {
        var module = getModuleByNamespace(this.$store, 'mapState', namespace);
        if (!module) {
          return
        }
        state = module.context.state;
        getters = module.context.getters;
      }
      return typeof val === 'function'                                        
        ? val.call(this, state, getters)                                      //state是函数时的逻辑,获取子模块的state会执行到这里
        : state[val]                                                          //返回state[val],也就是值
    };
    // mark vuex getter for devtools
    res[key].vuex = true;
  });
  return res
});

normalizeNamespace是统一的一个入口,用于格式化所有的辅助函数,如下:

function normalizeNamespace (fn) {                          //返回一个匿名函数,需要两个参数,分别是命名空间和映射,参数1可以省略
  return function (namespace, map) {
    if (typeof namespace !== 'string') {                          //如果参数1不是字符串(即忽略了命名空间)
      map = namespace;                                              //则修正参数1为map
      namespace = '';                                               //重置命名空间为null
    } else if (namespace.charAt(namespace.length - 1) !== '/') {
      namespace += '/';
    }
    return fn(namespace, map)                                     //最后执行fn函数
  }
}

其它几个辅助函数都差不多,就是传给normalizeNamespace的函数内实现略有不同。


推荐阅读
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 使用Powershell Studio快速构建GUI应用程序
    本文介绍了如何利用Powershell Studio创建功能强大的可视化界面。相较于传统的开发工具,Powershell Studio提供了更为简便和高效的开发体验,尤其适合需要快速构建图形用户界面(GUI)的场景。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 本文详细介绍了如何在PHP中删除数组中的指定元素、第一个元素和最后一个元素,并提供了具体的代码示例和相关函数的使用说明。 ... [详细]
  • 12月16日JavaScript变量、函数、流程、循环等***线上九期班
    12月16日JavaScript变量、函数、流程、循环等***线上九期班 ... [详细]
  • 本文详细介绍了如何在PHP中进行数组删除、清空等操作,并提供了在Visual Studio Code中创建PHP文件的步骤。 ... [详细]
  • 使用Nginx反向代理实现多域名端口映射
    本文介绍如何通过配置本地hosts文件和Nginx反向代理,实现多个虚拟域名的端口映射,使用户可以通过标准HTTP端口80访问不同后端服务。 ... [详细]
  • 历经三十年的开发,Mathematica 已成为技术计算领域的标杆,为全球的技术创新者、教育工作者、学生及其他用户提供了一个领先的计算平台。最新版本 Mathematica 12.3.1 增加了多项核心语言、数学计算、可视化和图形处理的新功能。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • Linux环境下C语言实现定时向文件写入当前时间
    本文介绍如何在Linux系统中使用C语言编程,实现在每秒钟向指定文件中写入当前时间戳。通过此示例,读者可以了解基本的文件操作、时间处理以及循环控制。 ... [详细]
  • 本文详细探讨了如何通过分析单个或多个线程在瓶颈情况下的表现,来了解处理器资源的消耗。无论是单进程还是多进程环境,监控关键指标如线程数量、占用时间及调度优先级等,有助于揭示潜在的性能问题。 ... [详细]
  • 优化网页加载速度:JavaScript 实现图片延迟加载
    本文介绍如何使用 JavaScript 实现图片延迟加载,从而显著提升网页的加载速度和用户体验。 ... [详细]
author-avatar
mobiledu2502876651
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有