首页 > 其他分享 >手撕Vuex-实现getters方法

手撕Vuex-实现getters方法

时间:2024-01-05 12:04:20浏览次数:23  
标签:Vuex getters 拿到 state 共享 方法 options Store


经上一篇章介绍,完成了实现共享数据的功能,实现方式是在 Store 构造函数中将创建 Store 时将需要共享的数据添加到 Store 上面,这样将来我们就能通过 this.$store 拿到这个 Store,既然能拿到这个 Store,我们就可以通过 .state 拿到需要共享的属性。

除了可以通过 .state 拿到共享数据之外,还可以通过 .getters 拿到共享数据,所以本章我们需要在 Nuex.js 文件中实现 getters 的功能。

首先在创建 Store 仓库的时候,需要传递一个 getters 对象,这个对象中存放的就是我们需要共享的数据,getters 对象中的每一个属性都是一个函数,这个函数的返回值就是我们需要共享的数据。

getters 属性是通过计算属性实现的。

我们先编写一下如上所说的内容代码方面的实现,更改 store/index.js:

export default new Vuex.Store({
    state: {
        name: 'BNTang'
    },
    getters: {
        myName(state) {
            return state.name + '666';
        }
    },
    mutations: {},
    actions: {},
    modules: {}
});

在使用之前,我们先将 Nuex.js 文件中的代码进行改写,将传递进来的getters放到Store上面,这样我们就能通过this.$store.getters拿到这个getters对象,既然能拿到这个getters对象,我们就可以通过 .myName 拿到需要共享的属性。

代码如下:

class Store {
    constructor(options) {
        this.state = options.state;

        // 将传递进来的getters放到Store上
        this.getters = options.getters;
    }
}

这么一顿操作之后,我们就能在组件中通过 this.$store.getters 拿到共享数据了。

App.vue:

<template>
  <div id="app">
    <p>{{ this.$store.getters.myName }}</p>
    <HelloWorld/>
  </div>
</template>

HelloWorld.vue:

<template>
  <div class="hello">
    <p>{{ this.$store.getters.myName }}</p>
  </div>
</template>

打开浏览器查看效果:

手撕Vuex-实现getters方法_html5

可以看到页面上显示的并不是我们想要的结果,我们想要的结果是 BNTang666,但是页面上显示的是一个函数,这是为什么呢?

其实在 Store 构造函数中,是不能直接将 getters 对象放到 Store 上面的, 需要自己额外处理一下,处理的方式分为如下四步骤:

  1. 拿到传递进来的getters
  2. 在Store上新增一个getters的属性
  3. 将传递进来的getters中的方法添加到当前Store的getters上
  4. 将getters中的方法执行, 并且将state传递过去

代码如下:

class Store {
    constructor(options) {
        this.state = options.state;

        // 1.拿到传递进来的getters
        let getters = options.getters || {};
        // 2.在Store上新增一个getters的属性
        this.getters = {};
        // 3.将传递进来的getters中的方法添加到当前Store的getters上
        for (let key in getters) {
            Object.defineProperty(this.getters, key, {
                get: () => {
                    // 4.将getters中的方法执行, 并且将state传递过去
                    return getters[key](this.state);
                }
            })
        }
    }
}

将代码改写之后,打开浏览器查看效果:

手撕Vuex-实现getters方法_html_02

可以看到页面上显示的是我们想要的结果。

到这里我们就完成了 getters 的实现。

标签:Vuex,getters,拿到,state,共享,方法,options,Store
From: https://blog.51cto.com/u_15652665/9112433

相关文章

  • 手撕Vuex-添加全局$store
    经过上一篇的介绍,了解到了Vuex的实现本质就是一个插件,所以要做的事情就是实现这个插件的代码编写即可。本篇文章主要是实现一个全局的$store,这个$store是挂载在Vue的原型上的,所以在任何一个组件当中都可以通过this.$store访问到。我们先来看看Vue官方的,我们分别在App.v......
  • 手撕Vuex-Vuex实现原理分析
    本章节主要围绕着手撕Vuex,那么在手撕之前,先来回顾一下Vuex的基本使用。创建一个Vuex项目,我这里采用vue-cli创建一个项目,然后安装Vuex。vuecreatevuex-demo选择Manuallyselectfeatures。这里只需要,Babel与Vuex。选择2.X版本的Vue:创建package.json:是否保存为模板......
  • 手撕Vuex-模块化共享数据下
    前言好,经过上一篇的介绍,了解了Vuex当中的模块化,本章主要介绍Vuex当中的模块化共享数据下篇。我们知道在全局的Store对象当中,我们可以定义全局的数据,那么如果我们在模块当中也定义了一个属性名称和全局的属性名称相同,那么会发生什么呢?我们先来看看,在全局当中定义了一个global......
  • 手撕Vuex-提取模块信息
    前言在上一篇【手撕Vuex-模块化共享数据】文章中,已经了解了模块化,与共享数据的注意点。那么接下来就要在我们自己的Nuex中实现共享数据模块化的功能。那么怎么在我们自己的Nuex中实现共享数据模块化的功能呢?处理数据也非常的简单,是不是就是处理一下子模块的数据,处理一下子模块......
  • 手撕Vuex-安装模块数据
    前言根据上一篇,【手写Vuex】-提取模块信息,我们已经可以获取到模块的信息了,将模块信息变成了我们想要的数据结构,接下来我们就要根据模块的信息,来安装模块的数据。在上一篇当中我们定义了一个ModuleCollection类,这个类的作用就是将模块的信息转换成我们想要的数据结构。接下来我们......
  • 手撕Vuex-安装模块方法
    前言经过上一篇文章的介绍,我们实现了将模块安装到store中,那么本章我们就来介绍一下怎么安装模块当中的方法也就是actions、mutations、getters。所以本次文章的目标就是将模块当中的actions、mutations、getters安装到store中,然后在组件中使用。分析阶段那么安装actions、m......
  • Dart 非常详细日期的操作方法
    Dart非常详细日期的操作方法近期在研究Dart源码,把关于Date这一块写个文章进行整理分享。在Dart中操作日期通过DateTime类来实现。由于DateTime是Dart内置的,所以不需要导入。解析DateTimeDateTime.parseDateTime.tryParseDateTime.utc解析一个日期可以通过DateTime.p......
  • 探索架构之美 | 小米分享架构师的方法论
    大家好,我是小米!今天我们要聊的话题可是相当精彩——“架构师的方法论”!作为一名热爱技术的小伙伴,我深知在软件开发领域,拥有一套科学的方法论是多么的重要。所以,不废话,让我们一起踏上探索架构的奇妙世界的征程吧!第一章:架构师的身份认同作为架构师,我们首先要明确自己的身份。不仅仅是......
  • N32G003 A版 SWD口配置成IO了 SWD进不去调试解决方法
    如果你的N32G003A版的SWD口被配置成了IO,并且现在无法通过SWD进行调试,你可以尝试以下方法来恢复SWD调试功能:首先,确保BOOT0引脚为低电平,然后按下复位按钮,这将使芯片复位并进入Bootloader模式。在Bootloader模式下,打开SWD功能。具体来说,需要将系统控制寄存器的SWD_USE_IO时钟控制......
  • 常见推断方法一览:极大似然估计、最大后验估计、期望最大化、贝叶斯推断、马尔科夫链蒙
    常见推断方法一览推断方法区别频率派极大似然估计MLE最大后验估计MAP期望最大化EM贝叶斯推断Bayesian马尔科夫链蒙特卡洛方法MCMC变分推断VI 推断方法区别极大似然估计(MaximumLikelihoodEstimation,MLE):解释:假设你有一堆骰子,你投掷它们很多次,然后记录下每次的结果......