Vue3:provide-inject实现组件通信

news2024/9/24 22:44:42

目录

一.作用

1.跨层级通信

2.避免重复声明

3.封装通用服务

二.性质

1.非响应式

2.不可选项

3.高级用法

三.使用

1.爷组件

2.父组件

3.子组件

四.代码

1.爷组件代码

2.父组件代码

3.子组件代码

五.效果


Vue3中的provide-inject机制是用于在组件树中进行依赖注入的一种方法,它允许父组件向其所有子孙组件提供数据或方法。

一.作用

1.跨层级通信

provide-inject机制使得父组件可以向其所有子孙组件提供数据或方法,无需通过props逐层传递。这简化了组件间的数据流,尤其是在处理深层嵌套的组件结构时。

2.避免重复声明

传统的父子组件传值需要用到props属性,如果组件层级比较复杂,就需要传递多次props属性。而provide-inject机制只需一次声明,就可以在所有子孙组件中使用。

3.封装通用服务

可以将一些通用的逻辑或数据封装在父组件中,并通过provide提供给需要的子孙组件。

二.性质

1.非响应式

provide和inject本身不是响应式的。如果父组件提供的值发生变化,子组件不会自动更新。如果需要响应式的数据传递,可以考虑使用Vuex或其他状态管理库。

2.不可选项

无论父组件是否真的提供了数据,子组件都会尝试注入。如果没有提供对应的provide,则inject的属性将会有一个默认值(如果指定了的话)。

3.高级用法

可以通过provide提供一个函数,而不是直接提供值。子孙组件在获取数据时,可以根据需要动态计算。还可以同时提供多个不同类型的数据。

三.使用

1.爷组件

1.首先,导入了Father组件和Vue 3的一些功能:ref、reactive和provide。

2.定义了一个名为money的响应式引用,初始值为100。

3.定义了一个名为car的响应式对象,包含brand和price属性,初始值分别为'宝马'和30。

4.定义了一个名为updateCar的方法,用于更新car对象的brand和price属性。

5.定义了一个名为updateMoney的方法,用于更新money的值。

6.使用provide函数将money和updateMoney方法提供给子组件,键名为'money'。

7.使用provide函数将car和updateCar方法提供给子组件,键名为'car'。

2.父组件

1.在模板部分,有一个div元素,类名为"father",包含一个标题(h4)显示"父组件",另一个标题显示爷爷的钱(money),以及一个按钮用于修改money的值。

2.导入了Son组件,并在模板中使用了标签来引入该组件。

3.使用inject函数从祖先组件中获取money和updateMoney属性。这里使用了默认值,如果祖先组件没有提供这些属性,那么money的默认值为0,updateMoney的默认值为一个空函数。

3.子组件

1.在模板部分,有一个div元素,类名为"son",包含一个标题(h4)显示"子组件",两个标题分别显示爷爷的存款和车的信息,以及一个按钮用于修改车的信息。

2.导入了inject函数,用于从祖先组件中获取数据和方法。这里使用了默认值,如果祖先组件没有提供这些属性,那么money的默认值为0,car的默认值为0,updateCar的默认值为一个空函数。

3.使用inject函数从祖先组件中获取money和car属性,以及updateCar方法。这样,我们就可以在组件中使用这些变量和方法了。

四.代码

1.爷组件代码

<template>
  <div class="grandfather">
    <h4>爷组件</h4>
    <h4>存款:{{ money }}</h4>
    <h4>汽车:{{ car }}</h4>
    <Father/>
  </div>
 </template>
  
 <script setup lang="ts" name="Father">
  import Father from "./Father.vue";
  import { ref,reactive,provide } from "vue";

  // 数据
  let money = ref(100)
  let car = reactive({
    brand:'宝马',
    price:30
  })

  // 更新车辆品牌
  function updateCar(value:any){
    car.brand = value
    car.price = 20
  }

  function updateMoney(value:number){
    money.value += value
  }

  // 提供数据
  provide('money',{money,updateMoney})
  provide('car',{car,updateCar})
 </script>

<style scoped>
.grandfather{
    background-color: green;
}
h4{
    margin-left: 20px;
    font-size: 20px;
}
</style>




2.父组件代码

<template>
    <div class="father">
        <h4>父组件</h4>
	    <h4>爷爷的钱:{{ money }}</h4>
        <button @click="updateMoney(5)">修改父亲的钱</button>
        <son/>
    </div>
</template>

<script setup lang="ts" name="father">
    import son from "./Son.vue";
    import { inject } from "vue";

    
let {money,updateMoney} = inject('money',{money:0,updateMoney:(x:number)=>{}})

</script>


<style scoped>
.father{
    background-color: orange;
}
h4{
    margin-left: 20px;
    font-size: 20px;
}
button{
  margin-left: 20xp;
  width: 200px;
  height: 40px;
}

</style>

3.子组件代码

<template>
    <div class="son">
        <h4>子组件</h4>
        <h4>爷爷的存款:{{ money }}</h4>
        <h4>爷爷的车:{{ car }}</h4>
        <button @click="updateCar('奥迪')">修改爷的车</button>
    </div>
</template>
    
<script setup lang="ts" name="father">
    import { inject } from "vue";

    let {money} = inject('money',{money:0})
    let {car,updateCar} = inject('car',{car:0,updateCar:(param:any)=>{}})
    
  
</script>
    
    
<style scoped>
.son{
    background-color: skyblue;
}
h4{
    margin-left: 20px;
    font-size: 20px;
}
button{
  margin-left: 20xp;
  width: 200px;
  height: 40px;
}
</style>




    

五.效果

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

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

相关文章

python异步处理

python中的异步处理属于比较高级的用法了&#xff0c;用来节省时间非常有用。传统的运行轨迹是阻塞的&#xff0c;就是一行代码必须完成了&#xff0c;然后才能运行下一行代码。异步运行就是我们现在有多个任务task1&#xff08;2s&#xff09;和task2&#xff08;3s&#xff0…

Linux快速安装ClickHouse

ClickHouse官方文档(有中文别忘了勾选) 什么是ClickHouse&#xff1f; | ClickHouse Docs 在线安装 1.安装yum-utils yum-utils是一个与 yum 集成的实用程序集合&#xff0c;可以通过多种方式扩展其本机功能 yum install -y yum-utils 2.增加ClickHouse官方镜像源 yum-c…

某易易盾验证码逆向

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架,本文网址如下,使用base64解码获得: aHR0cHM6Ly9kdW4uMTYzLmNvbS90cmlhbC9qaWdzYXc= ———————————————— 我们来看一下接口请求,这里关注的重点就…

力扣516-最长回文子序列(Java详细题解)

题目链接&#xff1a;力扣516-最长回文子序列 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5.如果没有ac打印dp数组 利于debug。 每…

后端开发工程师转行大模型领域:全面学习路线指南,非常详细收藏我这一篇就够了

随着人工智能技术的迅猛发展&#xff0c;特别是大模型&#xff08;如GPT-3、BERT等&#xff09;在自然语言处理、计算机视觉等多个领域的广泛应用&#xff0c;越来越多的技术人员开始考虑转型至这一充满挑战与机遇的新领域。对于已经在后端开发领域积累了丰富经验的工程师来说&…

如何解决软件企业文件传输难题?这款FTP替代工具一定适合你!

在信息技术飞速发展的今天&#xff0c;软件企业的数据传输需求不断攀升。传统的FTP&#xff08;文件传输协议&#xff09;虽然一度是企业数据交换的中坚力量&#xff0c;但其在多个方面的局限性逐渐成为企业发展的障碍。接下来&#xff0c;我们将探讨FTP的不足&#xff0c;并介…

值得入手的宠物空气净化器——希喂、352、IAM三款产品真实测评

在快节奏的现代生活中&#xff0c;养宠成为很多人的精神寄托&#xff0c;回到家中与猫咪玩耍是一天中最放松的时刻。但这美好的生活也存在着一些烦恼——宠物毛发清理与异味。宠物空气净化器作为一种新兴的清理工具&#xff0c;以其高效、全面的特点&#xff0c;受到了越来越多…

MySQL学习笔记(持续更新中)

1、Mysql概述 1.1 数据库相关概念 三个概念&#xff1a;数据库、数据库管理系统、SQL 名称全称简称数据库存储数据的仓库&#xff0c;数据是有组织的进行存储DataBase&#xff08;DB&#xff09;数据库管理系统操纵和管理数据库的大型软件DataBase Mangement System&#xf…

什么是动态数据脱敏?

原文地址 https://www.bytebase.com/blog/what-is-dynamic-data-masking/ 动态数据脱敏&#xff08;DDM&#xff09;动态更改返回给应用程序或用户的数据库记录&#xff0c;以此来实时保护敏感数据&#xff0c;且不会更改静态数据。 DDM 与静态数据脱敏&#xff08;SDM&#x…

OpenHarmony(鸿蒙南向)——平台驱动开发【MIPI DSI】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 DSI&#xff08;Display Serial Interface&#x…

身为程序员,转行请慎重:考虑以下几点再决定是否转向大模型领域

在决定从程序员转型到大模型领域之前&#xff0c;有几个关键点需要认真考虑。这些因素将帮助你更全面地评估这一转变是否适合你的职业规划和个人情况。 个人兴趣与激情 自我反思&#xff1a;你对人工智能、深度学习和自然语言处理等领域是否有浓厚的兴趣&#xff1f;兴趣是最好…

【论文解析】基于开源 Matrix 指令集扩展(矢量点积)的高性能 RISC-V 处理器“香山”(nanhu 版本)的 LLM 加速的研究

作者及发刊详情 摘要 正文 主要工作贡献 1&#xff09;针对大模型自定义矢量点积扩展指令&#xff0c;并设计了专用硬件加速大语言模型的运算 2&#xff09;基于香山处理器增加矢量点积计算单元和流水线处理逻辑&#xff0c;开发了包含上述指令的处理器nanhu-vdot 3&…

【环境搭建】MySQL安装部署

Win64安装MySQL Windows的玩法比较少&#xff0c;没有像MAC一样给你提供mysqld-safe等等各种的启动脚本&#xff0c;只有手动启动或者是以服务启动Mysql。 点击下载&#xff1a;MySQL5.5-8.0.7z (密码是11) 1.下载软件 这一步下载好软件就可以了&#xff0c;下载地址&#xff…

鸿蒙OpenHarmony【小型系统基础内核(进程管理任务)】子系统开发

任务 基本概念 从系统的角度看&#xff0c;任务Task是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源&#xff0c;并独立于其它任务运行。 OpenHarmony 内核中使用一个任务表示一个线程。 OpenHarmony 内核中同优先级进程内的任务统一调度、运…

《数据压缩入门》笔记-Part 1

一篇文章显得略长&#xff08;超过1w字&#xff09;&#xff0c;本文对应原书序言、前言、第1-5章。 第6-10章请参考Part 2&#xff0c;第11-15章&#xff0c;请参考Part 3。 序言 几点发现&#xff1a; 数据压缩需要花费时间并可能会导致软件变慢&#xff1b;改变数据的组织…

C++第一次练习

题目1 class Solution { public:bool isletter(char s){if(s<z&&s>a)return true;if(s>A&&s<Z)return true;return false;}string reverseOnlyLetters(string s) {if(s.empty()){return s;}int left,right;left0;rights.size()-1;while(left<ri…

最新绿豆影视系统 /反编译版源码/PC+WAP+APP端 /附搭建教程+软件

源码简介&#xff1a; 最新的绿豆影视系统5.1.8&#xff0c;这可是个反编译版的源码哦&#xff01;它不仅支持PC端、WAP端&#xff0c;还有APP端&#xff0c;一应俱全。而且附上了搭建教程和软件&#xff0c;安卓和苹果双端都能用&#xff0c;实用方便&#xff01; 优化内容&…

聆思CSK6大模型开发板上手参考

前面发了很多大模型语音交互相关的技术文章&#xff0c;这篇给大家介绍一下大模型语音交互示例的硬件和上手概况。 硬件概况 聆思CSK6大模型开发板长宽尺寸是99.1x72.1mm&#xff0c; 集成了摄像头、麦克风、扬声器、屏幕、无线模块、TF卡等&#xff0c;可以直接用于大模型语音…

2k1000LA 调试HDMI

问题: 客户需要使用HDMI 接口,1080p 的分辨率。 ---------------------------------------------------------------------------------------------------------------- 这里需要看看 龙芯派的 demo 版 的 硬件上的连接。 硬件上: 官方的demo 板 , dvo1 应该是 HDMI的…

如何选择游戏高防服务器,有什么需要注意的点?

自二十世纪初互联网迅速发展&#xff0c;市场发展瞬息万变&#xff0c;游戏行业也迎来了发展的春天。如今游戏行业已成为互联网行业的支柱&#xff0c;占据市场重要的比重。对于游戏行业的企业来说选择服务器是至为重要的一步&#xff0c;市场上的服务器良莠不济&#xff0c;如…