使用Provide和Inject设计Vue3插件

使用provide和inject的Vue依赖项注入非常适合构建Vue3插件或避免prop多层传递。

尽管不经常使用它,但是您可以仅使用两个内置方法来实现依赖项注入:provide和inject。

查看Composition API文档,在Vue 3.0中,使用Provide和Inject进行依赖项注入将更为常见。这主要是因为由于Composition API对this引用的更改,插件将不得不切换为使用此模式。

在本文中,我们将研究在Vue3中使用Provide和Inject以及如何将其用于构建VueJS插件。

为什么Vue3插件的工作方式有所不同?

在Vue2中,大多数插件会将属性注入this。例如,通过访问Vue路由器this.$router

但是,该setup()方法不再包含对的相同引用this。进行此更改的主要原因是增加了对Typescript的支持。

Sooo,“我们现在要如何访问我们的插件?”

幸运的是,我们可以使用provideinject帮助在我们的Vue应用程序中注入依赖项。

Provide / inject用于依赖项注入–使我们能够在Vue应用程序的根目录中提供一个插件,然后将其注入子组件中。

在Composition API中,只能在setup()方法期间调用这两种方法。

什么是provide / inject?

好的-我们知道我们必须使用provide和inject,但是那怎么工作呢?

基本上,我们只需要某种键来识别我们的依赖关系–出于我们的目的,我们将使用Javascript Symbol。

然后,我们的provide方法会将我们的Symbol与某个值相关联,而我们的inject方法将使用相同的Symbol检索该值。

看一个例子更有意义。

import { provide, inject } from 'vue'const LoggedInSymbol = Symbol()const ParentComponent = {setup() {provide(LoggedInSymbol, true)}
}const DeepDescendent = {setup() {// second optional param is a default value if it doesn't existconst isLoggedIn = inject(LoggedInSymbol, false)return {isLoggedIn}}
}

通过这种模式,实际上Vue3可以完成一些很酷的技巧。

我们可以在我们的应用程序中全局提供依赖项

如果我们想在全球范围内提供某些东西,则可以app.provide在声明Vue应用程序实例的任何地方使用。然后,我们可以像以前一样注入。

main.js

import { createApp } from 'vue'
import App from './App.vue'const app = createApp(App)const ThemeSymbol = Symbol()
app.provide(ThemeSymbol, 'dark')app.mount('#app')

我们可以使用ref提供反应数据

如果我们希望将反应性数据传递给子组件,这也非常方便。我们要做的就是使用传递给我们的提供方法一个反应性ref()

// in provider (parent)
const LoggedInSymbol = Symbol()
const loggedIn = ref('true')
provide(LoggedInSymbol, loggedIn)// in consumer (descendant)
const theme = inject(LoggedInSymbol, ref('false'))

我们如何使用provide / inject?

设计插件实际上与我们刚才看到的简单的provide / inject示例非常相似。

但是,我们不想使用单个值,而是要使用合成函数。这是Vue3的巨大优势之一-能够根据功能组织和提取代码。

由于我们的代码无论如何都应该用有组织的组合函数编写,因此我们只需要创建这些provide / inject方法以及BAM-我们就有了一个插件。

让我们快速看一下Vue3 Composition API文档提供的假设插件。

Plugin.js

const StoreSymbol = Symbol()export function provideStore(store) {provide(StoreSymbol, store)
}export function useStore() {const store = inject(StoreSymbol)if (!store) {// throw error, no store provided}return store
}

然后,我们的实际组件将像这样使用它。

// provide store at component root
//
const App = {setup() {provideStore(store)}
}const Child = {setup() {const store = useStore()// use the store}
}

如您所见,在某些根组件中,我们提供了插件,并向其传递了composition函数。然后,无论我们想在哪里使用它,都必须将其注入到我们的组件中。

组件永远不必真正进行provide / inject调用,而只需调用插件公开的provideStore / useStore方法。

所以我仍然可以使用旧的插件吗?

简短的答案? 是的。

长答案? 取决于你的意思。

由于Composition API纯粹是可加性的,因此您可以继续使用Options API,并具有与this以前相同的引用,并且所有旧插件都将工作相同。

但是,继续前进,绝对值得过渡到Vue3并利用其所有功能。

本质上,只要您想坚持使用Vue2 Options API,您的插件就可以正常工作。但是,无论如何,大多数维护良好的插件/库都应该添加对Vue3的支持。

结论

正确使用Provide / Inject绝对是 Vue开发中更高级的主题。

尽管大多数典型的应用程序不会使用这些概念,但是如果您对开发插件很认真,则Vue3 Composition API中的更改意味着您必须 使用provide / inject。

如果您想了解更多信息,请务必查看Composition API文档。

参考

Designing Vue3 Plugins Using Provide and Inject



喜欢的朋友记得点赞、收藏、关注哦!!!

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

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

相关文章

Navicat下载安装

官网地址:Navicat | Download Navicat Premium 14-day trial versions for Windows, macOS and Linux 1、进入官网下载地址,根据需求进行下载 2、双击安装程序,点击【下一步】 3、选择【我同意】,点击下一步 4、自定义安装路径&a…

Linux基于CentOS学习【进程状态】【进程优先级】【调度与切换】【进程挂起】【进程饥饿】

目录 进程状态 状态决定了什么 进程等待方式——队列 进程状态的表现 挂起状态 基于阻塞的挂起——阻塞挂起 swap分区 进程状态表示 Z僵尸状态 进程的优先级 什么是进程的优先级 为什么会有进程的优先级 进程饥饿 Linux的调度与切换 切换 调度 queue [ 140 ]&am…

使用本地模型根据对话对客户进行画像

基于ollama部署本地模型,如:qwen2.5。通过迭代提示词实现客户画像的生成,根据具体需求,通过迭代提示词可以达成目标。输出的结果可以要求JSON格式输出,当前模型JSON的解析准确率比较高,在输出的content中&a…

【可视化大屏】将柱状图引入到html页面中

到这里还是用的死数据&#xff0c;先将柱状图引入html页面测试一下 根据上一步echarts的使用步骤&#xff0c;引入echarts.js后需要初始化一个实例对象&#xff0c;所以新建一个index.js文件来进行创建实例化对象和配置数据信息等。 //在index.html引入<script src"j…

案例分享—国外优秀UI设计作品赏析

国外深色界面UI设计的简洁感首先来源于其对色彩运用的精妙。深色背景能有效减少视觉干扰&#xff0c;使关键元素如文字、图标等更加突出。这种设计不仅提升了信息的可读性&#xff0c;还让界面显得更为简洁、清晰&#xff0c;用户能够更快地找到所需信息&#xff0c;提升使用体…

Linux,中文输入法、C/C++编译环境配置

一、Linux中文输入配置 1、点击设置中的区域与语言 2、此处无声胜有声 一定要选第一个汉语&#xff08; Intelligent pingying&#xff09;,要不然最后打不出来中文字 二、VScode C/C环境配置 先下载插件&#xff0c;中文插件和C/C环境插件 终端依次执行下列命令行&#xff0…

【自动驾驶汽车通讯协议】GMSL通信技术以及加串器(Serializer)解串器(Deserializer)介绍

文章目录 0. 前言1. GMSL技术概述2. 为什么需要SerDes&#xff1f;3. GMSL技术特点4.自动驾驶汽车中的应用5. 结论 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解及成果&#xff0c;但是内容可能存在不准…

3D看车如何实现?有哪些功能特点和优势?

3D看车是一种创新的汽车展示方式&#xff0c;它利用三维建模和虚拟现实技术&#xff0c;将汽车以更真实、更立体的形式呈现在消费者面前。 一、3D看车的实现方式 1、三维建模&#xff1a; 通过三维建模技术&#xff0c;按照1:1的比例还原汽车外观&#xff0c;包括车身线条、细…

C语言 | Leetcode C语言题解之第452题用最少数量的箭引爆气球

题目&#xff1a; 题解&#xff1a; int cmp(void* _a, void* _b) {int *a *(int**)_a, *b *(int**)_b;return a[1] < b[1] ? -1 : 1; }int findMinArrowShots(int** points, int pointsSize, int* pointsColSize) {if (!pointsSize) {return 0;}qsort(points, pointsSi…

七氟烷麻醉药市场研究:未来几年年复合增长率CAGR为4.2%

七氟烷是一种吸入麻醉剂&#xff0c;用于在外科手术过程中诱导和维持全身麻醉。七氟烷是一种挥发性麻醉剂&#xff0c;常用于在外科手术过程中诱导和维持全身麻醉。它因起效快和作用消失快而受到青睐&#xff0c;是成人和儿科患者的理想选择。七氟烷通常通过吸入起作用&#xf…

linux-冯诺伊曼体系结构以及操作系统

冯诺依曼体系结构 我们不畅见到计算机&#xff0c;如笔记本&#xff0c;不常见的如服务器&#xff0c;大部分都遵循着冯诺伊曼体系结构 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是由一个个硬件组件组成。 输入单元&#xff1a;包括键盘 , 鼠标&#xff0c;扫描…

文件防泄密措施措施有哪些?5种文件防泄密措施等你体验!【小白成长篇!】

“千里之堤&#xff0c;溃于蚁穴。” 这句谚语告诉我们&#xff0c;再坚固的防线也可能因为一个小小的疏忽而崩溃。 在信息安全领域&#xff0c;文件泄密同样如此。 一个小小的失误&#xff0c;就可能导致企业的核心机密外泄&#xff0c;造成无法挽回的损失。 因此&#xff…

人脸表情行为识别系统源码分享

人脸表情行为识别系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

初入网络学习第一篇

引言 不磨磨唧唧&#xff0c;跟着学就好了&#xff0c;这个是我个人整理的学习内容梳理&#xff0c;学完百分百有收获。 1、使用的网络平台:eNSP 下载方法以及内容参考这篇文章 华为 eNSP 模拟器安装教程&#xff08;内含下载地址&#xff09;_ensp下载-CSDN博客https://b…

15分钟学 Python 第37天 :Python 爬虫入门(三)

Day 37 : Python爬虫入门大纲 章节1&#xff1a;Python爬虫概述 1.1 什么是爬虫&#xff1f; 网页爬虫&#xff08;Web Crawler&#xff09;是一种自动访问互联网上网页并提取数据的程序。爬虫的作用包括搜索引擎索引内容、市场调查、数据分析等。 1.2 爬虫的工作原理 发起…

计算机毕业设计 基于Django的在线考试系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

考研报名记录冲冲冲

研究生报名 网址 https://yz.chsi.com.cn/apply/ 报名包括网上报名和网上确认两个阶段&#xff0c;所有考生均须在规定时间内参加网上报名和网上确认。网上报名时间为2024年10月15日至10月28日&#xff08;网上预报名时间为2024年10月9日至10月12日&#xff0c;网上预报名和正…

Golang | Leetcode Golang题解之第455题分发饼干

题目&#xff1a; 题解&#xff1a; func findContentChildren(g []int, s []int) (ans int) {sort.Ints(g)sort.Ints(s)m, n : len(g), len(s)for i, j : 0, 0; i < m && j < n; i {for j < n && g[i] > s[j] {j}if j < n {ansj}}return }

Figma:现代设计工具使用指南

Figma&#xff1a;现代设计工具使用指南 在当今数字设计的世界中&#xff0c;Figma 已经成为设计师、开发者和团队协作的重要工具。作为一款基于云的设计平台&#xff0c;Figma 不仅支持界面设计和原型制作&#xff0c;还提供强大的协作功能。本文将详细介绍 Figma 的主要功能、…

aws(学习笔记第一课) AWS CLI,创建ec2 server以及drawio进行aws画图

aws(学习笔记第一课) 使用AWS CLI 学习内容&#xff1a; 使用AWS CLI配置密钥对创建ec2 server使用drawio&#xff08;vscode插件&#xff09;进行AWS的画图 1. 使用AWS CLI 注册AWS账号 AWS是通用的云计算平台&#xff0c;可以提供ec2&#xff0c;vpc&#xff0c;SNS以及clo…