经过上一篇的介绍,了解到了 Vuex 的实现本质就是一个插件,所以要做的事情就是实现这个插件的代码编写即可。

本篇文章主要是实现一个全局的 $store,这个 $store 是挂载在 Vue 的原型上的,所以在任何一个组件当中都可以通过 this.$store 访问到。

我们先来看看 Vue 官方的,我们分别在 App.vue, HelloWorld.vue 中打印 this.$store,看看能不能访问到。

mounted() {
console.log(this.$store);
}

可以看到都访问到了,那么我们就可以开始实现了。

官方开发插件文档:https://cn.vuejs.org/guide/reusability/plugins.html

我这里直接上代码,创建一个 Nuex.js 文件,在文件中先简单的暴露一个 install 方法。

这个 install 方法是 Vue.use() 调用的,所以在这个方法中可以接收到 Vue 的实例,然后在这个方法中实现我们的逻辑。

在使用 Vuex 的时候需要传递一个 store 对象,这个 store 对象就是我们的仓库,所以我们还需要在 Nuex.js 文件中暴露一个 Store 属性,这个属性的取值是一个类。

最终的代码如下:

/**
* install方法会在外界调用Vue.use的时候执行
* 并且在执行的时候会把Vue实例和一些额外的参数传递给我们
* @param Vue Vue实例
* @param options 额外的参数
*/
const install = (Vue, options) => {
} export default {
install
}

这样我们的插件就创建完毕了,接下来就是在 install 方法中实现我们的逻辑。给每一个Vue实例都添加一个 $store 属性。

在Vue中有一个名称叫做mixin方法,这个方法会在创建每一个Vue实例的时候执行,所以我们可以通过mixin方法给每一个Vue实例添加 $store 属性。

紧接着继续改写我们的代码,调用 Vue.mixin 方法重写 beforeCreate 方法,这个方法会在每一个组件创建的时候执行。

具体的核心逻辑我这里先不写,我先在 beforeCreate 方法中打印一下组件的一些参数信息。

打开浏览器控制台,运行结果如下:

可以看到在 beforeCreate 方法中打印了三次,Vue 实例化的时候会先实例化根组件,然后在实例化根组件的时候会先实例化子组件,所以会打印三次。(Vue,App, HelloWorld)

如何验证这个结论呢那么就是分别打印一下实例化组件的名称,根组件还没有添加 name 属性,先给我们的根组件也取一个名字,叫做 root:

在更改下 beforeCreate 方法打印的属性值为 $options.name 即可:

返回浏览器控制台观察输出结果:

输出的内容和我们的结论是一致的,知道了实例化的过程之后,接下来就是完善核心逻辑即可,我们知道在实例化过程中,首先实例化的是根组件,然后在实例化根组件的时候会先实例化子组件,所以我们可以在实例化根组件的时候给根组件添加一个 $store 属性,然后在实例化子组件的时候直接从父组件中取出 $store 属性赋值给子组件即可。

在根组件中有一个 store,只要将这个 store 赋值给 $store 即可,那么在子组件中就可以通过 this.$store 访问到了。

有了思路之后,我们就可以开始编写代码了,最终实现的代码如下:

beforeCreate() {
/*
如果是根组件, 那么默认就有store
我们只需要将store变成$store即可
*/
if (this.$options && this.$options.store) {
this.$store = this.$options.store;
} else {
/*
如果不是根组件, 那么默认没有store
我们只需要将它父组件的$store赋值给它即可
*/
this.$store = this.$parent.$store;
}
}

然后在将之前组件中访问 this.$store 的代码放开(取消注释):

然后重新运行项目,可以看到可以访问到 this.$store

到这里添加全局 $store 的代码就完成了(还没有实现数据共享,所以在各个组件当中访问共享数据的代码我都是注释掉了)。

手撕Vuex-添加全局$store的更多相关文章

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

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

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

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

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

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

  4. MySQL通过bin log日志恢复数据|手撕MySQL|对线面试官

    关注微信公众号[程序员白泽],进入白泽的知识分享星球 前言 作为<手撕MySQL>系列的第二篇文章,今天介绍一下MySQL的二进制日志(bin log),注意不要和MySQL的InnoDB ...

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

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

  6. 手撕Ford-Fulkerson algorithm 学一半的笔记

    目录 定义大概就这些 伪代码 自己做slide里的quiz 搬运别人的代码 我明白了, 余量网络 名如其名 比如你f/c=3/5 那么正边2,reverse edge3,加起来是5 在这个你建的新图上 ...

  7. Netty实现高性能IOT服务器(Groza)之手撕MQTT协议篇上

    前言 诞生及优势 MQTT由Andy Stanford-Clark(IBM)和Arlen Nipper(Eurotech,现为Cirrus Link)于1999年开发,用于监测穿越沙漠的石油管道.目标 ...

  8. 手撕RPC框架

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

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

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

  10. 手撕公司SSO登陆原理

    Single Sign-on SSO是老生常谈的话题了,但部分同学对SSO可能掌握的也是云里雾里,一知半解.本次手撕公司的SSO登陆原理,试图以一种简单,流畅的形式为你提供 有用的SSO登陆原理. 按 ...

随机推荐

  1. SpringBoot Docker Skywalking agent 不生效

    SpringBoot Skywalking agent 通过 Dockfile 配置 不生效 ENTRYPOINT ["java","-Djava.security.eg ...

  2. 3-3 vector 和 迭代器

    1 vector 容器vector可以理解为变长数组,它里面放的是相同类型的元素. vector<int> vec={1,2,3,4};//拷贝构造 vector<string> ...

  3. display:none和overflow:hidden的区别

    1.display:none 当将一个元素的display属性设置为none时,该元素将不会显示在网页中,并且不会占据任何空间.也就是说,该元素会完全隐藏,其他的元素会立即占据它原来的位置.该属性适用 ...

  4. RPC 框架性能测试,注意这 8 点就够了

    某天,二狗子写了一个 RPC 框架后,简单测了一下性能,发现超出 grpc 一大截.二狗子一高兴,忍不住找同事吹了一波.结果,同事亲测后对二狗子说框架性能也就这样.二狗子表示不服,跟同事一番唇枪舌剑后 ...

  5. js import的几种用法

    最近昨天公司小朋友离职,临时接收其负责的vue前端项目.vue好久没做了,很多东西都忘记或以前也没接触,几天开始慢慢写点vue的小知识,算是历程或备忘吧. import在js.ts中用了不知多少次,但 ...

  6. OS | 文件系统总结

    文件系统总结 逻辑文件面向用户,学习时应该掌握不同的逻辑文件之间的特点 目录文件时链接逻辑文件和物理文件的桥梁,学习时应该体会到目录文件时如何优化访问时间 物理文件是指文件的数据如何存储在磁盘等存储设 ...

  7. AtCoder Educational DP Contest 刷题记录

    写在前面 深感自己 DP 很弱的 村人B 刷了点 DP 题,题集地址戳这里. 后记:刷完后感觉自己又行了 A - Frog 1 题意 给定 \(n\) 个石头,第 i 个石头的高度为 \(h_i\). ...

  8. Java ConcurrentHashMap 高并发安全实现原理解析

    本文首发于 vivo互联网技术 微信公众号链接:https://mp.weixin.qq.com/s/4sz6sTPvBigR_1g8piFxug作者:vivo 游戏技术团队 一.概述 Concurr ...

  9. 3、springboot连接数据库

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

  10. vue如何实现v-model