【手写 Vuex 源码】第十一篇 - Vuex 插件的开发

news2024/11/25 20:16:20

一,前言

上一篇,主要介绍了 Vuex-namespaced 命名空间的实现,主要涉及以下几个点:

  • 命名空间的介绍和使用;
  • 命名空间的逻辑分析与代码实现;
  • 命名空间核心流程梳理;

本篇,继续介绍 Vuex 插件机制的实现;


二,Vuex 插件使用介绍

1,Vuex 插件使用

Vuex 不仅提供了全局状态管理能力,还进一步提供了插件机制,便于开发者对 Vuex 插件进行增强;

Vuex 插件的使用方式:通过 Store 类提供的 plugin 数组进行 Vuex 插件注册:

const store = new Vuex.Store({
  // plugins:注册 vuex 插件
  plugins: [
    plugin1(),
    plugin2()
  ]
});

备注:在 plugins 数组中可以注册多个 Vuex 插件,插件的执行是串行顺序执行的;

2,Vuex 内置的 logger 日志插件

在 Vuex 插件中,内置了 logger 日志插件:

// src/store/index.js

import Vue from 'vue';
import Vuex from 'vuex';

// 引入 Vuex 日志插件 logger
import logger from 'vuex/dist/logger'

Vue.use(Vuex);

const store = new Vuex.Store({
  plugins: [
    logger(),   // 日志插件:导出的 logger 是一个高阶函数
  ],
});
export default store;

备注:

  • logger 为 Vuex 内置插件,在 vuex 包中 dist 目录下;
  • logger 是一个高阶函数,便于在使用插件时进行传参;

logger 插件的执行效果:

为 Vuex 添加 logger 插件后,当状态发生变化时,控制台将会输出相关日志:

image.png

如图所示,控制台日志将输出所触发的事件类型、事件名称、及事件执行前后的状态变化;

logger 插件的效果相当于 AOP 面向切面编程,在事件触发前后分别输出了相关的日志;

这样,通过开启 Vuex 日志插件,增强了开发环境下的调试体验,便于开发者快速定位状态相关的问题;


三,Vuex 插件开发

1,vuex-persists 状态持久化插件

在使用 Vuex 插件进行状态管理时,一定会遇到一个问题:当页面刷新时(如使用 F5 进行刷新),将导致页面状态丢失;

为了解决这个问题,可以使用状态持久化插件:vuex-persists;

2,vuex-persists 插件的实现

Vuex 插件的开发并不复杂:

  1. 创建一个 Vuex 插件,最终导出一个高阶函数(在 plugin 数组中进行插件注册);
  2. Vuex 的 Store 类提供的订阅方法 store.subscribe:当 mutation 方法触发时被执行;
  3. Vuex 的 Store 类提供的状态替换方法 store.replaceState:能够更新 Vuex 中的状态;

基于 Vuex 提供的插件机制,vuex-persists 插件的实现逻辑如下:

  1. 创建高阶函数 persists,当 vuex 初始化时通过 plugin 完成拆件的注册和初始化操作;
  2. 使用 store.subscribe 订阅方法:当 mutation 方法触发时,将当前状态保存到本地;
  3. 当页面刷新时,状态将会丢失,同时 Vuex 插件重新初始化,此时重新读取本地状态,并通过store.replaceState将本地状态(即刷新丢失的状态)替换到 Vuex 状态,实现状态的持久化效果;

备注:本地存储可通过 persists 插件参数在外部配置:

  • localstorage
  • sessionstorage
  • cookie;

代码实现:

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

// vuex-persists 插件实现
function persists() {
  return function (store) {
    console.log("----- persists 插件执行 -----")
    // 取出本地存储的状态
    let data = localStorage.getItem('VUEX:STATE');
    if (data) {
      console.log("----- 存在本地状态,同步至 Vuex -----")
      // 如果存在,使用本地状态替换 Vuex 中的状态
      store.replaceState(JSON.parse(data));
    }
    // subscribe:由 vuex 提供的订阅方法,当触发 mutation 方法时被执行;
    store.subscribe((mutation, state) => {
      console.log("----- 进入 store.subscribe -----")
      localStorage.setItem('VUEX:STATE', JSON.stringify(state));
    })
  }
}

const store = new Vuex.Store({
  plugins: [
    logger(),   // 日志插件:导出的 logger 是一个高阶函数
    persists()  // 持久化插件:vuex-persists
  ]
});

export default store;

3,测试插件效果

1,启动项目,控制台输出日志:完成 persists 插件初始化;

image.png

2,点击按钮更新状态:

点击按钮,触发根模块 mutation 类型 changeNum 方法,按照插件注册顺序执行 logger、persists 插件;

触发 subscribe 状态变更事件订阅的回调方法,将新状态保存至本地存储 localStorage,根模块商品数量状态 num 由 10 更新为 15;

3,当页面刷新时:

若没有持久化插件,会由于页面刷新导致 Vuex 中的状态丢失;

此时,当页面刷新时,persists 持久化插件在重新执行初始化操作时,会读取本地存储中保存的状态数据,即由于页面刷新丢失的数据,并通过 store.replaceState 方法更新 Vuex 中的状态,实现状态的持久化效果;

这样就实现了一个状态持久化插件的雏形;

接下来,继续实现 Vuex 所提供的插件机制;


四,Vuex 插件机制分析

通过官方 Vuex 插件所提供的插件机制,创建并实现了一个简易的 Vuex 插件;

Vuex 插件的实现,主要使用 Vuex 提供的以下方法:

  • Vuex 插件的 plugins 数组,提供插件注册功能;
  • store.subscribe:状态变更时的订阅回调功能;
  • store.replaceState:状态替换功能;

下一篇,将根据以上分析,实现 Vuex 的插件机制;


五,结尾

本篇,主要介绍了 Vuex 插件的开发,主要涉及以下几个点:

  • Vuex 插件的使用介绍;
  • Vuex 插件开发和使用分析;
  • Vuex 插件机制的分析;

下一篇,继续介绍 Vuex 插件机制的实现;


维护日志

  • 20211012
    • 由于新扩充的 Vuex 插件机制源码部分较多,故将 Vuex 插件部分拆分为两篇文章:《Vuex 插件开发》和《Vuex 插件机制实现》;
    • 修改文章标题和摘要;
    • 优化文字描述与 md 排版格式;

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

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

相关文章

GWAS:mtag (Multi-Trait Analysis of GWAS) 分析

mtag (Multi-Trait Analysis of GWAS)作用:通过对多个表型相似的GWAS summary结果进行联合分析,发现更多的表型相关基因座。 以抑郁症状、神经质和主观幸福感这三个表型为例,分别对他们进行GWAS分析,鉴定得到32、9 和 13个基因座与…

前端食堂技术周刊第 70 期:Volar 的新开端、Lighthouse 10、良好的组件设计、React 纪录片、2022 大前端总结

美味值:🌟🌟🌟🌟🌟 口味:黑巧克力 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 本期摘要 Volar 的新开端Chrome 110 的新功能Lighthouse 10Nuxt v3.2.0加速 JavaSc…

【github】解决超限制文件上传失败问题

之前因为push的一堆文件中有个104MB的大文件在里面,导致push一直失败一直失败超时又报错 一开始我还以为是VPN的问题,搞了好久都没解决 后来一步一步回撤发现是因为卡在了我那个104MB的文件这里 查阅了github的官方文档 关于 GitHub 上的大文件 - Git…

【计算机网络期末复习】第五章 传输层

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📣专栏定位:为想复习学校计算机网络课程的同学提供重点大纲,帮助大家渡过期末考~ 📚专栏地址: ❤️如果有收获的话,欢迎点…

运动蓝牙耳机怎么选、最适合运动的蓝牙耳机推荐

很多人喜欢跑步时听歌来放松心情起到解压效果。但一般的无线蓝牙耳机很容易脱落丢失,甚至因为防水效果太菜导致耳机进水,很容易就损坏耳机了,加上运动出汗给耳腔带来的黏腻感与长期佩戴引发的疼痛感,这时一款好的运动设备就显得尤…

基于ISO13400 (DoIP) 实现车辆刷写

近年来,在整车研发中基于以太网实现车辆高带宽通讯无疑是人们热议的话题。无论是车内基于车载以太网减少线束成本,实现ADAS、信息娱乐系统等技术,还是基于新的电子电气架构以及远程诊断需求,实现以太网诊断(DoIP&#…

prepend和append同时使用的时候,prepend中的内容不显示

前几天做项目的时候,遇到一个需求,需要做一个类似于下面的样式: 当我看完element的时候,自信满满,这不就是prepend和append嘛,简单!!!此时的我不会想到后续经历的坎坷。 …

手语检测识别

论文:Real-Time Sign Language Detection using Human Pose Estimation Github:https://github.com/google-research/google-research/tree/master/sign_language_detection SLRTP 2020 手语识别任务包括手语检测(Sign language detection&a…

蓝桥杯C/C++VIP试题每日一练之回形取数

💛作者主页:静Yu 🧡简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者 💛社区地址:前端知识交流社区 🧡博主的个人博客:静Yu的个人博客 🧡博主的个人笔记本:前端面试题 个人笔记本只记录前端领域的面试题目,项目总结,面试技…

以掘金示例,利用内链/外链进行网站SEO优化

前言 内链:从自己网站的一个页面指向另外一个页面。通过内链让网站内部形成网状结构,让蜘蛛的广度和深度达到最大化。 外链:在别的网站导入自己网站的链接。通过外链提升网站权重,提高网站流量。 一般来说,内链和外链…

JVM类加载机制

回到2018年的抖音哈哈. 回顾下: java开发环境: java编译运行过程: 1) 编译期:.java源文件,经过编译,生成.class字节码文件 2) 运行期:JVM加载.class并运行.class(0和1) 特点: 跨平台、一次编程,处处报错 名词解释: 1…

线上商超博弈:老将固守,抖音掀浪

配图来自Canva可画 2023年,抖音对本地生活服务的野心愈加膨胀了。 近日,关于“抖音将于3月1日上线全国外卖服务”的消息传得沸沸扬扬。虽然抖音官方出面回应“团购配送”项目在北京、上海、成都等城市试点中,目前暂无具体时间表,…

api是什么意思?又该如何使用呢?

一、应用程序编程接口 API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。 API全称 "…

kkfileview从Git拉取代码编译部署到服务器

今天遇到了需求是,使用kkfileview预览的时候自带的页面嵌套后页面显示的不是很友好,然后就配合前端下载了源码,本地测试运行很完美,但是部署到服务器(centos8)上安装openOffice环境坑死了 1、从gitee拉取代…

计算机网络 - 1. 体系结构

目录概念、功能、组成、分类概念功能组成分类分层结构概念总结OSI 七层模型应用层表示层会话层传输层网络层数据链路层物理层TCP/IP 四层模型OSI 与 TCP/IP 相同点OSI 与 TCP/IP 不同点为什么 TCP/IP 去除了表示层和会话层五层参考模型概念、功能、组成、分类 概念 &#x1f…

kail工具的使用--- cewl

1.介绍 Cewl是一款采用Ruby开发的应用程序,可以给他的爬虫指定URL地址和爬取深度,还可以添加外部链接,接下来Cewl会给你返回一个字典文件,你可以把字典用到类似John the Ripper这样的密码破解工具中。 2.使用 输入以下命令之后…

Python 处理Excel内的数据

(一)案例一介绍 现在有一匹电商产品跟当日销量的数据,如下,总共有上万笔的数据,现在需要统计每个品牌当日的销售量,比如美宝莲今天总共卖出了多少的商品,另外需要统计每个品牌下面的每个子品类…

【Flutter】DartPad 终极在线Dart编程环境

文章目录一、什么是DartPad二、如何使用三、使用技巧四、如何利用好DartPad五、总结一、什么是DartPad "Success is not final, failure is not fatal: it is the courage to continue that counts." - Winston Churchill"成功不是终点,失败不是致命…

cas 登录成功不跳转 CommonUtils.getResponseFromServer

目录报错信息问题背景问题原因现场服务器情况流程修改方法报错信息 2016-08-18 17:05:08.718 [http-bio-8080-exec-9] ERROR org.jasig.cas.client.util.CommonUtils.getResponseFromServer - 连接超时 java.net.ConnectException: 连接超时 java.net.ConnectException: Conne…

Springboot + VUE+Uniapp全套JAVA高端WMS仓库管理系统源码

WMS框架:springboot mybatis redis mysql VUE uniapp 包含:服务端JAVA全套源码, VUE后台前端代码uniapp前端微信小程序源码 说明:uniapp前端如需发布其他端小程序,请自行进行适配调整。 功能: 1、支持入库、质检…