写点什么

【Vuex 源码学习】第十三篇 - Vuex 辅助函数的实现

用户头像
Brave
关注
发布于: 刚刚
【Vuex 源码学习】第十三篇 - Vuex 辅助函数的实现

一,前言


上一篇,主要介绍了 Vuex 插件机制的实现,主要涉及以下几个点:


  • Vuex 插件机制分析;

  • Vuex 插件机制核心逻辑实现:plugins 插件注册、subscribe 订阅收集、replaceState 状态替换;


本篇,继续介绍 Vuex 辅助函数的实现;


二,辅助函数的介绍

1,辅助函数的作用


继续以之前的代码作为示例:

<template>  <div id="app">    <br> 根模块测试: <br>    商品数量: {{this.$store.state.num}} 个<br>    商品单价: 10 元<br>    订单金额: {{this.$store.getters.getPrice}} 元<br>    <button @click="$store.commit('changeNum',5)">同步更新:数量+5</button>    <button @click="$store.dispatch('changeNum',-5)">异步更新:数量-5</button>
<br> 子模块测试: <br> A 模块-商品数量: {{this.$store.state.moduleA.num}} 个<br> B 模块-商品数量: {{this.$store.state.moduleB.num}} 个<br> C 模块-商品数量: {{this.$store.state.moduleA.moduleC.num}} 个<br> <button @click="$store.commit('moduleA/changeNum',5)">A 模块-同步更新:数量+5</button> <button @click="$store.commit('moduleB/changeNum',5)">B 模块-同步更新:数量+5</button> <button @click="$store.commit('moduleA/moduleC/changeNum',5)">C 模块-同步更新:数量+5</button> </div></template>
复制代码


可以发现,在项目使用 Vuex 插件中 State、getter、mutation、action 时,需要通过类似 this.$store.state.num 这样一长串才可以实现,当模块层级较深就会变得更长;这种不太优雅的写法,也会影响到代码的可读性及后续运维;


所以,Vuex 插件提供了一系列辅助函数,用于简化和解决上边的问题;

2,辅助函数功能介绍


Vuex 提供了以下辅助函数:

  • mapState:在组件的 computed 中使用;

  • mapGetters:在组件的 computed 中使用;

  • mapMutations:在组件的 methods 中使用;

  • mapActios:在组件的 methods 中使用;

  • createNamespacedHelpers:获取指定命名空间下的辅助函数;



三,Vuex 辅助函数的使用

1,辅助函数的使用示例


使用官网 Vuex 插件提供的辅助函数对示例进行优化:

<template>  <div id="app">    <br> 根模块测试: <br>    商品数量: {{num}} 个<br>    商品单价: 10 元<br>    订单金额: {{getPrice}} 元<br>  </div></template>
<script>import { mapState, mapGetters, mapMutations, mapActions } from "vuex";export default { mounted() { console.log("store", this.$store); }, computed: { ...mapState(["num"]), ...mapGetters(["getPrice"]) }, methods: { }};</script>
复制代码



四,Vuex 辅助函数的实现

1,辅助函数逻辑分析


辅助函数 mapState、mapActions、mapMutations,通过将 vuex.store 中的属性映射到 vm 实例上,从而实现通过 vm 实例可以直接访问到 vuex.store 中的属性,简化 Vuex 操作;

2,mapState 实现

export function mapState(stateArr) {    let obj = {};    for (let i = 0; i < stateArr.length; i++) {        let stateName = stateArr[i];        obj[stateName] = function() {            return this.$store.state[stateName]        }    }    return obj}
复制代码



五,结尾


本篇,主要介绍了 Vuex 辅助函数的实现,主要涉及以下几个点:


  • Vuex 辅助函数作用;

  • Vuex 辅助函数使用介绍;

  • Vuex 辅助函数逻辑分析与实现;


至此,《Vuex 源码学习笔记》专栏完结,后续将会继续完善扩充;


明天开始下一个源码专栏~

用户头像

Brave

关注

还未添加个人签名 2018.12.13 加入

还未添加个人简介

评论

发布
暂无评论
【Vuex 源码学习】第十三篇 - Vuex 辅助函数的实现