经上一篇章介绍,完成了实现共享数据的功能,实现方式是在 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>

打开浏览器查看效果:

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

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

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

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

手撕Vuex-实现getters方法的更多相关文章

  1. 手撕RPC框架

    手撕RPC 使用Netty+Zookeeper+Spring实现简易的RPC框架.阅读本文需要有一些Netty使用基础. 服务信息在网络传输,需要讲服务类进行序列化,服务端使用Spring作为容器.服 ...

  2. NN入门,手把手教你用Numpy手撕NN(一)

    前言 这是一篇包含极少数学推导的NN入门文章 大概从今年4月份起就想着学一学NN,但是无奈平时时间不多,而且空闲时间都拿去做比赛或是看动漫去了,所以一拖再拖,直到这8月份才正式开始NN的学习. 这篇文 ...

  3. NN入门,手把手教你用Numpy手撕NN(2)

    这是一篇包含较少数学推导的NN入门文章 上篇文章中简单介绍了如何手撕一个NN,但其中仍有可以改进的地方,将在这篇文章中进行完善. 误差反向传播 之前的NN计算梯度是利用数值微分法,虽容易实现,但是计算 ...

  4. NN入门,手把手教你用Numpy手撕NN(三)

    NN入门,手把手教你用Numpy手撕NN(3) 这是一篇包含极少数学的CNN入门文章 上篇文章中简单介绍了NN的反向传播,并利用反向传播实现了一个简单的NN,在这篇文章中将介绍一下CNN. CNN C ...

  5. 编译原理--05 用C++手撕PL/0

    前言 目录 01 文法和语言.词法分析复习 02 自顶向下.自底向上的LR分析复习 03 语法制导翻译和中间代码生成复习 04 符号表.运行时存储组织和代码优化复习 05 用C++手撕PL/0 在之前 ...

  6. 用C/C++手撕CPlus语言的集成开发环境(1)—— 语言规范 + 词法分析器

    序言 之所以叫做CPlus语言,是因为原本是想起名为CMinus的,结果发现GitHub和Gitee上一堆的CMinus的编译器(想必都是开过编译原理课程并且写了个玩具级的语言编译器的大佬们吧).但是 ...

  7. 手撕spring核心源码,彻底搞懂spring流程

    引子 十几年前,刚工作不久的程序员还能过着很轻松的日子.记得那时候公司里有些开发和测试的女孩子,经常有问题解决不了的,不管什么领域的问题找到我,我都能帮她们解决.但是那时候我没有主动学习技术的意识,只 ...

  8. java实现二叉树的Node节点定义手撕8种遍历(一遍过)

    java实现二叉树的Node节点定义手撕8种遍历(一遍过) 用java的思想和程序从最基本的怎么将一个int型的数组变成Node树状结构说起,再到递归前序遍历,递归中序遍历,递归后序遍历,非递归前序遍 ...

  9. Vue学习之--------深入理解Vuex之getters、mapState、mapGetters(2022/9/3)

    这一篇博客的内容是在上一篇博客的基础上进行:深入理解Vuex.原理详解.实战应用 @ 目录 1.getters的使用 1.1 概念 1.2 用法 1.3 如何读取数据 2.getters在项目中的实际 ...

  10. (面试题)面试官为啥总是让我们手撕call、apply、bind?

    引言 上一篇关于<面试官为啥总是喜欢问前端路由实现方式>的文章发布后,发现还是挺受欢迎的.这就给我造成了一定的困惑 之前花了很长时间,实现了一个自认为创意还不错的关于前端如何利用node+ ...

随机推荐

  1. Axure 多人协作

    创建团队项目 团队 => 从当前文件创建团队项目 签出的文件才能被修改 签出 签入 发布评论 邀请 编辑的5种状态 和SVN差不多的概念 已有项目导入 https://www.bilibili. ...

  2. 【短道速滑四】Halcon的texture_laws算子自我研究

    Halcon里有个texture_laws 算子,最近实现了下,记录下相关细节. Halcon的文档里对该算子是这样描述的: texture_laws - Filter an image using ...

  3. pip 的高阶玩法

    pip 的高阶玩法 pip 应该是大家最熟悉的 Python 包安装与管理工具了,但是除了pip install 这个最常用的命令,还有很多有用的玩法.这里就介绍几个我平时会用到的,希望对大家有所帮助 ...

  4. 备忘 springboot 整合ehcache,注入CacheManager时提示 required a bean of type 'org.springframework.cache.CacheManager' that could not be found

    问题因人而异,此处仅做备忘 整合过程: 1.添加maven依赖 <dependency> <groupId>net.sf.ehcache</groupId> < ...

  5. Spark Final-Examination Note

    重点 4567,Special 4,5 3道编程题,分值 35(基本书上,不超纲) 选填各 20分,简答 5 题/25分,编程题 3题/35分. 简答题参考每章课后习题 第 1 章简答题 1. 请阐述 ...

  6. HDU - 1711:Number Sequence (KMP模板)

    原题链接 KMP模板:AC,858ms,13112KB内存 消耗太大了 #include<bits/stdc++.h> using namespace std; using namespa ...

  7. StringBuilder 线程不安全,到底哪里不安全?

    StringBuilder 线程不安全,到底哪里不安全? 在Java中,字符串拼接是一个非常常见的操作,而对于频繁变动的字符串内容,使用StringBuilder是一个性能优化的选择.但是,Strin ...

  8. 8、SpringBoot 事务

    系列导航 springBoot项目打jar包 1.springboot工程新建(单模块) 2.springboot创建多模块工程 3.springboot连接数据库 4.SpringBoot连接数据库 ...

  9. vue2+高德地图web端开发

    https://blog.csdn.net/qq_51553982/article/details/123014412

  10. element的table组件在flex布局下宽度不能自适应

    问题描述 用了flex布局,左侧固定宽度,右侧flex:1:(表格在右侧区域),且中间容器都有width:100%,当将屏幕变大,表格随着变宽,当屏幕变小时,表格不会随着屏幕变小,宽度无法自适应. 解 ...