首页 > 其他分享 >手撕Vuex-添加全局$store

手撕Vuex-添加全局$store

时间:2023-10-28 14:55:34浏览次数:30  
标签:Vue 方法 实例 组件 全局 Vuex options store

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

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

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

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

image-20231028122125928

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

官方开发插件文档: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 方法中打印一下组件的一些参数信息。

image-20231028142241388

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

image-20231028142432851

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

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

image-20231028142757748

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

image-20231028142930627

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

image-20231028143013047

输出的内容和我们的结论是一致的,知道了实例化的过程之后,接下来就是完善核心逻辑即可,我们知道在实例化过程中,首先实例化的是根组件,然后在实例化根组件的时候会先实例化子组件,所以我们可以在实例化根组件的时候给根组件添加一个 $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 的代码放开(取消注释):

image-20231028144203188

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

image-20231028144109223

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

标签:Vue,方法,实例,组件,全局,Vuex,options,store
From: https://www.cnblogs.com/BNTang/p/17794074.html

相关文章

  • 手撕Vuex-Vuex实现原理分析
    本章节主要围绕着手撕Vuex,那么在手撕之前,先来回顾一下Vuex的基本使用。创建一个Vuex项目,我这里采用vue-cli创建一个项目,然后安装Vuex。vuecreatevuex-demo选择Manuallyselectfeatures。这里只需要,Babel与Vuex。选择2.X版本的Vue:创建package.json:是......
  • vuex的使用
    1.Vue的入口文件引入Vuex:```importVuexfrom'vuex';Vue.use(Vuex);```2.创建一个Vuexstore实例Store实例是一个单一的数据源,用于存储应用程序的状态。您可以在store实例中定义状态、mutations、actions和gettersconststore=newVuex.Store({state:{//状态},mut......
  • vuex 的数据丢失如何处理?
    方法一:存储在LocalStorage、SessionStorage、IndexDB等。这些都是浏览器的API,可以将数据存储在硬盘上,做持久化存储。在初始化state数据的时候,从localStorage中获取:state={userInfo:localStorage.getItem('userInfo')}由于localStorage不是响应式的,需要手......
  • 【Java 进阶篇】JavaScript 中的全局对象和变量
    JavaScript是一门非常强大的编程语言,它提供了许多全局对象和变量,以便于在整个应用程序中共享数据和功能。本文将详细介绍JavaScript中的全局对象和变量,包括全局对象、全局变量、全局函数以及它们的用途和示例。全局对象JavaScript中有一些全局对象,它们在整个应用程序中都可用。......
  • elment 的Message或$message 全局控制X号是否展示
     main.jsVue.prototype.$message=function(option){option.offset=70option.showClose=truereturnMessage(option)}Vue.prototype.$message.success=function(msg){returnMessage.success({message:msg,offset:7......
  • 派克斯电脑全局改IP如何辅助捉妖游戏
    捉妖游戏是一款非常受欢迎的手机游戏,玩家需要通过探索地图来捉到各种可爱的妖精。为了让游戏更具趣味性,玩家可以通过地图制作来设计自己的捉妖之旅。在这篇教程中,我们将向您展示如何使用电脑全局软件工具——派克斯,来制作捉妖游戏的地图。捉妖游戏的地图制作可以让玩家更好地探索游......
  • 华为云耀云服务器L实例 - bookstore项目(1)
     要在华为云耀云服务器L实例上运行我们项目,首先需要打包我们的本地项目然后上传到华为云耀云服务器L实例上要打包Spring项目,可以使用工具如Maven或Gradle。以下是使用Maven进行Spring项目打包的步骤:1. 确保您的项目目录中包含一个有效的pom.xml文件,该文件描述了项目的依赖......
  • 华为云耀云服务器L实例 - bookstore项目(3)
     要使用Navicat连接华为云耀云服务器L实例数据库并创建新的数据库,可以按照以下步骤进行操作:1. 确保远程数据库服务器设置允许远程连接:在数据库服务器上,确保远程访问的权限已正确配置。通常,这涉及启用远程访问并确保防火墙或网络安全组允许数据库服务器的入站连接。2. 安......
  • 华为云耀云服务器L实例 - bookstore项目(2)
     要在华为云耀云服务器L实例安装Tomcat(Apache Tomcat),可以按照以下步骤进行操作:使用Apache Tomcat的二进制发行版安装1. 下载Tomcat:首先,您需要从Tomcat官方网站下载Tomcat的二进制发行版。访问 Tomcat下载页面 并选择最新版本的二进制发行版。通常,您会选择一个tar.gz(Un......
  • 华为云耀云服务器L实例 - bookstore项目(4)
     要将WAR包部署在华为云耀云服务器L实例服务器中,您可以按照以下步骤进行操作:1. 检查Tomcat服务器的安装和配置:确保已经正确地安装和配置了Tomcat服务器。您可以通过在浏览器中访问http://localhost:8080来验证Tomcat服务器是否正常运行。2. 关闭Tomcat服务器:如果Tomcat......