实现简易版Vuex

从实现一个简单的 Vuex 类来了解 Vuex 的工作原理。

实现思路

Vuex 下拥有 install 方法和 Store 类。即创建一个 Vuex 的模块,这个模块导出 install 方法和 Store 类。

install 方法

Vuex 是 Vue 的一个插件,所以需要实现 Vue 插件约定的 install 方 法。

Vue.use 内部会调用 Vuex 对象的 install 方法。

install作用:在 install 中把创建 Vue 根实例时传入的store对象注入到 Vue 实例的$store中。目的是,在所有组件中可以通过this.$store获取到 Vuex 中的仓库。

然而在 install 方法中无法拿到 Vue 的实例对象(vm)。

怎么解决呢?

Vuex 中通过混入 beforeCreate 来获取 Vue 实例。

部分代码如下所示:

function install(Vue) {// 将Vue实例传递给一个局部变量,以便在函数范围内使用_Vue = Vue;// 通过混入beforeCreate来获取Vue实例,从而拿到选项中的store对象_Vue.mixin({beforeCreate() {if (this.$options.store) {this.$store = this.$options.store;} else if (this.$options.parent && this.$options.parent.$store) {this.$store = this.$options.parent.$store}},});
}

每个组件实例在创建之前,都会检查是否有store选项,如果有,则将其注入到组件实例的$store属性中。如果没有,它会在组件的父级链中查找$store属性。

Store

首先 store 是一个类,它的构造函数接受一个对象作为参数,这个对象中的属性就是我们熟悉的 stategettersmutationsactions

  • 实现构造函数,接收 options
  • state 的响应式处理。
  • getterrs 的实现。
  • commitdispatch 方法。

注意:

下面代码对 getters 处理中:
其中this.getters = Object.create(null),此处不直接写this.getters = getters,是因为下面的代码中要方法 getters 中的 key 如果这么写的话,会导致 this.gettersgetters 指向同一个对象,当访问 getterskey 的时候,实际上就是访问 this.getterskey 会触发 key 属性的 get,会产生死递归。

class Store {constructor(options) {const { state = {}, getters = {}, mutations = {}, actions = {} } = options;this.state = _Vue.observable(state);// 此处不直接 this.getters = getters,会产生死递归this.getters = Object.create(null);Object.keys(getters).forEach((key) => {Object.defineProperty(this.getters, key, {// 箭头函数 返回通过key在getters中获取到的方法的执行 结果get: () => getters[key](this.state), // 这里是state如何传到getters中的});});// mutations actions都是内部属性,不希望外部直接访问到this._mutations = mutations;this._actions = actions;}commit(type, payload) {this._mutations[type](this.state, payload);}dispatch(type, payload) {this._actions[type](this, payload);}
}

完整结构

Vue 中使用 Vuex 示例如下:
store–index.js

import Vue from 'vue' 
import Vuex from 'vuex' 
Vue.use(Vuex)
export default new Vuex.Store({state: { count: 0, msg: "Hello World" },getters: {reverseMsg(state) {return state.msg.split("").reverse().join("");},},mutations: {increate(state, payload) {state.count += payload.num;},},actions: {increate(context, payload) {setTimeout(() => {context.commit("increate", { num: 5 });}, 2000);},},
});

myvuex–index.js

let _Vue = null;class Store {constructor(options) {const { state = {}, getters = {}, mutations = {}, actions = {} } = options;this.state = _Vue.observable(state);// 此处不直接 this.getters = getters,会产生死递归this.getters = Object.create(null);Object.keys(getters).forEach((key) => {Object.defineProperty(this.getters, key, {// 箭头函数 返回通过key在getters中获取到的方法的执行 结果get: () => getters[key](this.state), // 这里是state如何传到getters中的});});// mutations actions都是内部属性,不希望外部直接访问到this._mutations = mutations;this._actions = actions;}commit(type, payload) {this._mutations[type](this.state, payload);}dispatch(type, payload) {this._actions[type](this, payload);}
}function install(Vue) {// 将Vue实例传递给一个局部变量,以便在函数范围内使用_Vue = Vue;// 通过混入beforeCreate来获取Vue实例,从而拿到选项中的store对象_Vue.mixin({beforeCreate() {if (this.$options.store) {this.$store = this.$options.store;} else if (this.$options.parent && this.$options.parent.$store) {this.$store = this.$options.parent.$store}},});
}// 导出模块
export default {Store,install,
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/12325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux:ftp文件传输实验

Linux:ftp文件传输实验 实验实现 # 安装对应软件 [rootserver120 ~]# dnf install vsftpd -y [rootserver120 ~]# dnf install lftp -y# 关闭防火墙以及开启服务 [rootserver120 ~]# systemctl disable --now firewalld [rootserver120 ~]# systemctl enable --no…

ambari-server高可用配置方案

制品 https://kdocs.cn/l/cie4hSgvUunX 前置条件 环境需要支持VRRP协议 环境需要配置好yum源 变更影响面 变更不会影响其他组件 配置lb(需要客户侧配置并提供LB地址) 转发方式选择 主备 监听端口为8080、8440、8441 协议为tcp 后端监听选择kde-offline1为主

【RAG 论文】UPR:使用 LLM 来做检索后的 re-rank

论文:Improving Passage Retrieval with Zero-Shot Question Generation ⭐⭐⭐⭐ EMNLP 2022, arXiv:2204.07496 Code: github.com/DevSinghSachan/unsupervised-passage-reranking 论文:Open-source Large Language Models are Strong Zero-shot Query…

【HR】阿里三板斧--20240514

参考https://blog.csdn.net/haydenwang8287/article/details/113541512 头部三板斧 战略能不能落地、文化能不能得到传承、人才能不能得到保障。 头部三板斧适用的核心场景有三个:一是战略不靠谱;二是组织效率低、不聚心;三是人才跟不上。对…

c++ 各版本特性介绍

c C是一种高级编程语言,以其强大的功能、灵活性和高效性而闻名。它是由Bjarne Stroustrup在20世纪80年代初期在贝尔实验室开发的,作为C语言的一个扩展。C不仅包含了C语言的所有特性,还引入了面向对象编程(OOP)的概念&…

基于Vue3+ElementPlus项目,复制文字到剪贴板功能实践指南,揭秘使用js-tool-big-box工具库的核心优势

在前端开发项目中,很多时候有那么一个场景,就是要求将一段文案复制下来,这段文案可能是一串很长的id,可能是一条命令语句,可能是一小段文案,复制到剪贴板上。这样有利于用户复制到其他地方去,使…

自然资源-城乡规划行业未来二十年将何去何从?

自然资源-城乡规划行业未来二十年将何去何从? 城乡规划行业未来风口在以下几个方向,看好啦!紧跟国家发展战略和政策背景。 1.大数据的城市规划应用。 包含:公共数据平台的搭建CIM,数据赋能治理,城市规划中大数据应用的研究 等…

微软必应bing国内官方代理商,广告账户如何开户?

微软必应Bing作为全球知名的搜索引擎之一,其广告平台为众多企业提供了广阔的市场空间和精准的推广机会。对于中国内地的企业而言,通过必应Bing开展国内广告推广不仅能够触及更广泛的潜在客户群体,还能有效提升品牌影响力。通过微软必应Bing国…

【算法作业】均分卡牌,购买股票

问题描述 John 有两个孩子,在 John病逝后,留下了一组价值不一定相同的魔卡, 现在要求你设计一种策略,帮John的经管人将John的这些遗产分给他的两个孩子,使得他们获得的遗产差异最小(每张魔卡不能分拆&#…

搜索引擎的设计与实现(三)

目录 5 系统详细实现 5.1实现环境配置 5.2功能实现 5.2.1 建立索引 5.2.2 文件搜索实现 5.2.3 数据库的连接配置 5.2.4 数据库搜索实现 5.2.5 后台数据编辑实现 前面内容请移步 搜索引擎的设计与实现(二) 免费源代码&毕业设计论文 搜索…

git-删除workspace.xml的跟踪

问题描述 .gitignore 文件内容如下: .pyc *.pyc user_files/ .vscode/ __pycache__//.idea/misc.xml /.idea/modules.xml /.idea/inspectionProfiles/profiles_settings.xml /.idea/inspectionProfiles/Project_Default.xml /.idea/batrp_webbackend-server-dev.i…

NARUTO 复现记录

1 环境配置 下载项目,一定要 git 下载全项目,下载完后要检查third_parities 里面的coslam和neural_slam_eval 文件全不全。 git clone --recursive https://github.com/oppo-us-research/NARUTO.git 环境配置 注意 bash scripts/installation/conda…

番外篇 | 利用PyQt5+YOLOv5来搭建目标检测系统(附可视化界面+功能介绍+源代码)

前言:Hello大家好,我是小哥谈。PyQt5是一个Python绑定的Qt库,是用于创建图形用户界面(GUI)和其他应用程序组件的工具包。PyQt5提供了许多GUI元素,如按钮、文本框、标签等,也提供了许多Qt的功能,如网络、数据库、XML等。通过PyQt5可以在Python中使用Qt的丰富功能和强大的工…

克服亏损的负面影响 学学现货白银止损的方法

一个多月以前,现货黄金的上涨还十分强劲,一度还逼近历史的高位30大关。但是我们看近半个月以来,现货白银价格出现了调整。很多在高位买入的投资者都承受了较大的亏损,这时候就凸显出了现货白银止损的作用。如果投资者能够通过近期…

Git 基础使用(2) 分支管理

文章目录 分支概念分支使用查看分支分支创建分支切换分支合并合并冲突分支删除 分支管理快进模式分支策略内容保存错误处理 分支概念 (1)分支概念 Git分支是指在版本控制系统Git中,用来表示项目的不同工作流程或开发路径的一个重要概念。通过…

【cmake】Windows 环境下编译第三方依赖源码(以编译Xerces库为例)

第三方依赖源码的编译分为两种,一种是使用 Configure 脚本编译,另一种是使用 CMakeLists.txt 编译。Xerces 3.2.3 的编译方式是 CMakeLists.txt 脚本编译。 必要软件: CMake (CMake | Download)Visual Studio 2019&a…

前端AJAX讲解

目录 1.AJAX是什么? 2.异步交互和同步交互 3.AJAX常见应用情景和优缺点 4.AJAX的优缺点 5.AJAX发送异步请求(四步操作) 6.经典案例 1.AJAX是什么? AJAX即“Asynchronous JavaScript and XML”(异步的JavaScript与…

指针基础实践

文章目录 1.声明指针2.初始化指针3.指针地址和大小,值4.指针解引用,修改值5.指针指向堆内存,修改值6.申请堆内存并释放7.数组释放8.指针运算9.指针递增10.指针递减11.指针常量12.常量指针13.常量指针指向常量 1.声明指针 2.初始化指针 3.指针地址和大小…

【数据结构】二叉树(Binary Tree)

文章目录 一、树的概念及结构二、二叉树的概念及结构1.二叉树的概念2.特殊的二叉树3.二叉树的性质 三、二叉树的存储顺序存储链式存储 四、二叉树的实现1.创建二叉树2.二叉树的遍历前序遍历中序遍历后序遍历层序遍历根据遍历顺序创建二叉树 3.二叉树的基本操作1.总结点个数2.二…

ctfshow之_萌新web9至web10

一、访问在线靶场ctfshow 1、web9 如下图所示,进入_萌新赛的web9问题,题目提醒flag在config.php中: 如上图所示,可以get传参,且传入的参数需要正则匹配system、exec、highlight,且不区分大小写&#xff0…