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

手撕Vuex-实现getters方法

时间:2023-10-28 16:23:39浏览次数:34  
标签: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>

打开浏览器查看效果:

image-20231028155949288

可以看到页面上显示的并不是我们想要的结果,我们想要的结果是 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);
                }
            })
        }
    }
}

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

image-20231028160738710

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

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

标签:Vuex,getters,拿到,state,共享,方法,options,Store
From: https://www.cnblogs.com/BNTang/p/17794215.html

相关文章

  • Linux中设置NTP时间同步服务器的方法
    概括:在Linux中设置NTP时间同步服务器是确保多台主机之间时间同步的重要步骤。本文将从四个方面详细阐述Linux中设置NTP时间同步服务器的方法,包括安装NTP、配置NTP客户端、配置NTP服务器以及常见问题及其解决方法。1、安装NTP安装NTP是为了确保Linux主机能够正常运行时间同......
  • 手撕Vuex-实现共享数据
    经过上一篇章介绍,完成了添加全局$store,接下来就是实现共享数据的功能。在Vuex中,共享数据是通过state来实现的,所以我们需要在Nuex.js文件中实现state的功能。在Vuex中,state是一个对象,这个对象中存放的就是我们的共享数据,所以我们需要在Nuex.js文件中定义一个state......
  • Hook重载方法和构造方法
    Hook重载方法和构造方法1.1hook重载方法/*adbshellsucd/data/local/tmp/./frida-server-16.0.19-android-arm64端口转发adbforwardtcp:27042tcp:27042adbforwardtcp:27043tcp:27043*///搜索setPwd(Md5importfridaimportsys#连接手机设备rdev=......
  • Java基础 Java 为什么非要在 锁对象身上调用 wait()方法 和 notifyAll()方法
    在Java中,wait()和notify()方法必须在同步块或同步方法内部使用,通常在锁对象上调用,有以下原因:1.互斥性:当你在同步块内部使用wait()和notify()方法时,它们与锁对象紧密相关,确保在调用wait()和notify()时能够维持互斥性。这意味着在调用wait()时,当前线程会释放锁,而在调用notify()时,......
  • 手撕Vuex-添加全局$store
    经过上一篇的介绍,了解到了Vuex的实现本质就是一个插件,所以要做的事情就是实现这个插件的代码编写即可。本篇文章主要是实现一个全局的$store,这个$store是挂载在Vue的原型上的,所以在任何一个组件当中都可以通过this.$store访问到。我们先来看看Vue官方的,我们分别在Ap......
  • 手撕Vuex-Vuex实现原理分析
    本章节主要围绕着手撕Vuex,那么在手撕之前,先来回顾一下Vuex的基本使用。创建一个Vuex项目,我这里采用vue-cli创建一个项目,然后安装Vuex。vuecreatevuex-demo选择Manuallyselectfeatures。这里只需要,Babel与Vuex。选择2.X版本的Vue:创建package.json:是......
  • 断点下载帮助方法
    核心代码publicstaticclassDownloadHelper{///<summary>///断点下载///</summary>///<paramname="controller"></param>///<paramname="fullpath"></param>///<returns......
  • Java基础 同步方法
    同步代码块就是把一段代码给锁起来,这样就可以解决多线程操作共享数据时带来的数据安全问题但是如果我们想要把一个方法里面所有的代码全都锁起来,就没有必要用同步代码块了,我们可以直接把synchronized加在方法上,这个方法就叫做同步方法 同步方法的格式:修饰符 synchroniz......
  • vuex的使用
    1.Vue的入口文件引入Vuex:```importVuexfrom'vuex';Vue.use(Vuex);```2.创建一个Vuexstore实例Store实例是一个单一的数据源,用于存储应用程序的状态。您可以在store实例中定义状态、mutations、actions和gettersconststore=newVuex.Store({state:{//状态},mut......
  • 结合大学四年经验,带你揭秘高效自学Java的方法和路线(从认识、方法、反馈3个角度出发)
    前言大家好,我是bigsai好久不见,甚是想念,本文就自学Java的n个问题和n个方法做出一些建议,并且推荐了一条自学Java的路线,比较适合一些新入门的小白。无论你是大学生还是在职人员,想学Java时,都会面临两个选择,自学或者报班。报班通常太费钱,时间又不自由;自学又不知道如何下手,担心自己坚持......