vue3中 provide/inject用法详解

news2024/11/15 13:29:26

依赖注入:provide 和 inject

什么情况下推荐provide/inject使用:Prop 多层级数据透传

通常情况下,当我们需要从父组件向子组件传递数据时,会使用 props。想象一下这样的结构:有一些多层级嵌套的组件,形成了一棵巨大的组件树,而某个深层的子组件需要一个较远的祖先组件中的部分数据。在这种情况下,如果仅使用 props 则必须将其沿着组件链逐级传递下去,这会非常麻烦:

在这里插入图片描述
上图方式,数据传递,只会一级一级的向下传递,如果组件链路非常长,可能会影响到更多这条路上的组件。这一问题被称为“prop 逐级透传”,显然是我们希望尽量避免的情况

provide 和 inject 可以帮助我们解决这一问题

一个父组件相对于其所有的后代组件,会作为依赖提供者。任何后代的组件树,无论层级有多深,都可以注入由父组件提供给整条链路的依赖

在这里插入图片描述
Provide (提供)

provide() 函數接收兩個參數 provide(注入名,注入值)

<script setup>
import { provide } from 'vue'

provide(/* 注入名 */ 'message', /* 值 */ 'hello!')

//例子
provide('message', 'hello!')
</script>

第一個參數被稱為注入名,可以是一個字符串或是一個Symbol。後代組件會用注入名來查找期望注入的值。一个組件可以多次调用 provide(),使用不同的注入名,注入不同的依赖值。

第二個參數是提供的值,值可以是任意类型,包括响应式,比如一個 ref

import { ref, provide } from 'vue'

const count = ref(0)
provide('key', count)
provide全局注入
// main.ts页面
import { createApp } from 'vue'

const app = createApp({})

app.provide('message', 'hello!')  //全局注入一个message数据

//所有組件中都可以获取到注入的message数据
使用 Symbol 作注入名

什么情况下使用 Symbol 作为注入名:大型的应用,包含非常多的依赖提供,或者你正在编写提供給其他开发者使用的组件库

const myInjectionKey = Symbol()
provide(myInjectionKey, { /*要提供的数据*/ });

const injected = inject(myInjectionKey)

Inject (注入)

获取 provide注入数据的方法

<script setup>
import { inject } from 'vue'

const message = inject('message')

console.log('message', message)  //输出 hello!
</script>

注意:如果提供的值是一个 ref,注入进来的会是该 ref 对象,而不会自动解包为其內部的值(注入进来是什么类型,接收的就是什么类型)

inject 设置接收默认值

//如果注入的message为空的话 value会是默认的值  XXXXXX
const value = inject('message', 'XXXXXX')

在一些场景中,默认值可能需要通过调用一个函数或初始化一个类来取得

const value = inject('key', () => new ExpensiveClass(), true)

//第三个参数表示默认值应该被当作一个工厂函数

配合响应式数据使用

当提供 / 注入响应式的数据时,建议尽可能將任何对响应式状态的变更都保持在提供方組件中

<!-- 在供給方組件/父组件內 -->
import { provide, ref } from 'vue'

const location = ref('North Pole')

function updateLocation() {
  location.value = 'South Pole'
}

provide('location', {
  location,
  updateLocation
})
<!-- 在注入方組件/子组件内 -->
<script setup>
import { inject } from 'vue'

const { location, updateLocation } = inject('location')
</script>

<template>
   // 点击 updateLocation方法,可以调用父组件的updateLocation方法,从而更改 location 的值
  <button @click="updateLocation">{{ location }}</button>
</template>

如果你想确保提供的数据不能被(注入方组件/子组件)修改,可以使用 readonly() 来包裝提供的值

// readonly() 只读
const count = ref(0)

provide('read-only-count', readonly(count))

具体参考: https://zh-hk.vuejs.org/guide/components/provide-inject.html#prop-drilling

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

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

相关文章

云HIS综合管理系统源码,云端SaaS服务,与监管系统有序对接,扩展性强

云HIS系统&#xff1a; 本套云HIS系统是一款适用于二级及以下医院、专科医院和社区卫生机构的综合性医院信息系统&#xff0c;它包含门诊预约挂号、收费结算、排班、医护协同、药房、药库、电子病历等10大功能模块&#xff0c;支持门诊、住院、医技、后勤各项核心业务。 采用…

每天五分钟玩转深度学习框架PyTorch:选择函数where和gather

本文重点 如图表所示,这几个方法可以理解为索引函数,有些函数在切片和索引一章进行了简单的介绍,本文将再次进行介绍,温故知新。 index_select 通过特殊的索引来获取数据index_select,这个这样来理解,第一个参数表示a的第几维度,第二个参数表示获取该维度的哪部分。 我…

strimzi operator 部署kafka集群

Strimzi介绍 官方文档:https://strimzi.io/docs/operators/0.42.0/overview#kafka-components_str Strimzi介绍 Strimzi 是一个用于 Apache Kafka 在 Kubernetes 上部署和管理的开源项目。它提供了一组 Kubernetes 自定义资源定义(Custom Resource Definitions,CRDs)、控制…

Oracle11.2.0 安装手册V1.0.doc

文档说明 编写目的 本手册是给系统技术人员人员提供Red Hat Enterprise Linux 5.4环境下得Oracle 11g的安装和配置指导&#xff0c;帮助实施人员或用户能够快速安装配置Oracle 11g。 准备介质 适用于Linux x86-64的Oracle Database 11g第2版 linux.x64_11gR2_database_1of2.…

校园课程助手【4】-使用Elasticsearch实现课程检索

本节将介绍本项目的查询模块&#xff0c;使用Elasticsearch又不是查询接口&#xff0c;具体流程如图所示&#xff08;如果不了解Elasticsearch可以使用sql语句进行查询&#xff09;&#xff1a; 这里是两种方法的异同点&#xff1a; Mysql&#xff1a;擅长事务类型操作&#…

​EtherCAT、CANopen、RS485在电机控制中的对比

​EtherCAT、CANopen、RS485在电机控制中的对比 EtherCAT 特点&#xff1a; 高速通信&#xff1a;EtherCAT是一种实时以太网技术&#xff0c;数据传输速度快&#xff0c;具有极低的通信延迟和抖动。 高同步性&#xff1a;可精确同步多台设备&#xff0c;适用于高要求的控制任…

Python爬虫技术 第23节 数据清洗和预处理

在使用Python进行网络爬虫项目时&#xff0c;数据清洗和预处理是非常重要的步骤。这些步骤有助于确保从网页上抓取的数据准确、一致&#xff0c;并且适合后续的分析或机器学习任务。下面我将详细介绍如何使用Python来进行数据清洗和预处理。 1. 数据获取 首先&#xff0c;你需…

Java 实现 AVL树

在二叉平衡树中&#xff0c;我们进行插入和删除操作时都需要遍历树&#xff0c;可见树的结构是很影响操作效率的。在最坏的情况下&#xff0c;树成了一个单支树&#xff0c;查找的时间复杂度成了O(N)&#xff0c;建树跟没建树一样。那么是不是有什么办法可以建一个树避免这种情…

基于 KubeSphere 的 Kubernetes 生产环境部署架构设计及成本分析

转载&#xff1a;基于 KubeSphere 的 Kubernetes 生产环境部署架构设计及成本分析 前言 导图 1. 简介 1.1 架构概要说明 今天分享一个实际小规模生产环境部署架构设计的案例&#xff0c;该架构设计概要说明如下&#xff1a; 本架构设计适用于中小规模(<50)的 Kubernetes …

本地生活服务商公司有哪些?一文教你搭建本地生活系统!

当前&#xff0c;本地生活领域群雄环伺&#xff0c;日益激烈的竞争推动各家互联网大厂调整布局模式的同时&#xff0c;也让本地生活市场持续迸发新的活力。在此背景下&#xff0c;想要通过本地生活服务商身份入局的创业者数量不断增多&#xff0c;以本地生活服务商公司有哪些等…

前端面试题整理-CSS

两栏布局 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>两栏布局</title><style>…

java计算机毕设课设—基于网络爬虫技术的网络新闻分析系统(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; java计算机毕设课设—基于网络爬虫技术的网络新闻分析系统 基于网络爬虫技术的新闻分析系统&#xff0c;它能够实时抓取凤凰网、网易、新浪、搜狐等网站的新闻数据&#xff0c;提取正文和点击量&#xff0c;每日定时抓取。系统还能对抓取的新闻进行…

给echarts图表线条、数据点和区域设置颜色

let myChart echarts.init(document.getElementById("chartmainCop"));// 获取当前干部的各项评分const allIndicators Object.keys(this.dialogEacherTable[0]).filter(key > key ! "CadreID" && key ! "xm").map(key > ({name…

window电脑上使用python将pdf转换为word文档

1、电脑上安装Python运行环境 一、python官网下载链接 二、下载到电脑后&#xff0c;直接运行安装 三、安装完成后按&#xff1a;winR键进入window命令控制窗口&#xff0c;输入 python --version2、设置python依赖包国内镜像源 pip config set global.index-url https://mirr…

国家发改委区域司韩振海副司长一行莅临麒麟信安调研

7月31日&#xff0c;国家发改委区域司韩振海副司长一行莅临麒麟信安调研。湖南省发改委区域处处长孙健军&#xff0c;长沙市发改委党组成员、市长株潭一体化发展事务中心主任邹犇淼等相关领导陪同调研。麒麟信安总裁刘文清热情接待。 在麒麟信安展厅&#xff0c;韩振海副司长一…

在MANET中的TCP增强

本文内容节选自一篇系统性文献综述&#xff08;Systematic Literature Review, SLR&#xff09;&#xff0c;标题为“TCP Performance Enhancement in IoT and MANET”&#xff0c;由 Sultana Parween 和 Syed Zeeshan Hussain 撰写&#xff0c;发表在《International Journal …

Windows下Rust OpenCV环境配置

首发于Enaium的个人博客 安装Chocolatey 首先我们需要安装Chocolatey&#xff0c;Chocolatey是一个Windows的包管理器。 我们点击右上角的Install进入到Installing Chocolatey&#xff0c;选择Individual 复制命令 Set-ExecutionPolicy Bypass -Scope Process -Force; [Sys…

springboot餐饮管理系统-计算机毕业设计源码73168

摘要 随着科技的不断进步和互联网时代的深入发展&#xff0c;餐饮行业正面临着一场由传统向智能化、信息化转变的革命。传统的餐饮管理方式&#xff0c;如手工点餐、纸质菜单、人工结算等&#xff0c;已经无法满足现代餐饮企业对于效率、准确性和用户体验的高要求。因此&#x…

【Hot100】LeetCode—31. 下一个排列

目录 题目1- 思路2- 实现⭐31. 下一个排列——题解思路 3- ACM 实现 题目 原题连接&#xff1a;31. 下一个排列 1- 思路 技巧题&#xff0c;分为以下几个步骤 ① 寻找拐点&#xff1a; i 1 &#xff1a;出现 nums[i1] > nums[i] &#xff0c;则 i 1 就是拐点 从右向左遍…

技术守护尊严||Chat GPT在抵抗性骚扰的作用分析

就在本周&#xff0c;中国人民大学女博士实名举报导师性骚扰的事情&#xff0c;引发全网关注&#xff01; 性骚扰&#xff0c;无论在线上还是线下&#xff0c;无论在职场还是校园&#xff0c;都是对个人尊严与权益的严重侵犯。 幸运的是&#xff0c;随着人工智能技术的飞速发…