Vue3从入门到实战:深度掌握组件通信(下部曲)

 5.组件通信方式5-$attrs

$attrs的概念:

在Vue中,$attrs 是一个特殊的属性,用于访问父组件向子组件传递的非特定属性。它可以让子组件轻松地获取父组件传递的属性,而无需在子组件中显式声明这些属性。

想象一下你有一个父组件和一个子组件,你希望通过属性将一些数据从父组件传递到子组件。通常情况下,你需要在子组件中定义这些属性,然后通过父组件将数据传递给子组件。

但是,有时候你可能希望传递一些额外的属性,这些属性在子组件中并没有声明。这时候,$attrs 就派上用场了。

当你在父组件中将属性传递给子组件时,如果子组件没有显式声明这些属性,那么这些属性会被收集到 $attrs 对象中。子组件可以通过访问 $attrs 来获取这些传递的额外属性。

这就好像是你在给子组件写一封信时,除了信中明确提到的事项外,你还可以附带一些额外的内容。而子组件可以通过查看信的附件来获取这些额外的内容。

通过使用 $attrs,子组件可以轻松地访问父组件传递的这些额外属性,而无需在子组件中显式声明它们。这样可以使得组件之间的通信更加灵活和方便。

5.1父组件传孙组件

概述:$attrs用于实现当前组件的父组件,向当前组件的子组件通信(祖→孙)。

 此时需要建立这三个组件

1.父组件(Father.vue)

2.子组件(Child.vue)

3.孙组件(GrandChild.vue)

1. 在Father.vue文件里面增添一些响应式数据

 2.先从父组件传来给子组件

 3.实现组件再传给孙组件,孙组件在接收即可

实现效果:

 5.2孙组件传给父组件

现在我们让孙组件可以传递一个参数,让父组件的响应式a接收这个参数 

1.定义一个updataA方法

2.放在子组件进行接收

3.子组件内容不用变

4.孙组件内容增添


 6.组件通信方式6-$refs、$parent

$refs、$parent的概念:

在Vue中,$refs 和 $parent 是用于在组件之间进行通信的特殊属性。

首先,让我们来了解 $refs。当你在Vue模板中给一个元素或组件添加 ref 属性时,你就可以通过 $refs 来访问该元素或组件的引用。简单来说,$refs 就像是给元素或组件起了一个名字标签,让你可以在Vue实例中轻松地引用它们。

想象一下你有一个组件,里面有一个按钮元素,你希望在Vue实例中能够获取到这个按钮并进行一些操作。你可以在按钮上添加一个 ref 属性,比如 ref="myButton"。然后,你就可以通过 $refs.myButton 来访问这个按钮了。

$refs 是一个对象,它的属性名就是你在 ref 属性中指定的名字,而对应的属性值就是对应的元素或组件的引用。通过访问 $refs 属性,你就可以像操作普通的DOM元素一样操作引用的元素或组件。

接下来,我们来看看 $parent。在Vue组件的层级结构中,每个组件都可以有一个父组件。当你需要在子组件中访问父组件的数据或方法时,可以使用 $parent

想象一下你有一个父组件和一个子组件,你希望在子组件中获取父组件的某个属性或调用父组件的方法。你可以通过 $parent 来实现这个目标。

$parent 是一个特殊属性,它可以让你在子组件中访问父组件实例。通过 $parent,你可以直接访问父组件的数据属性或方法,就好像你是在父组件内部一样。

  1. 概述:

    • $refs用于 :父→子。

    • $parent用于:子→父。

  2. 原理如下:

 此时需要建立这三个组件

1.父组件(Father.vue)

2.子组件1(Child1)

3.子组件2(Child2)

分别给这三个组件增添点响应式数据


 6.1在父组件修改子组件的内容

现在要在父组件设置一个按钮,点击按钮可以将Child的"奥特曼"修改成"小猪佩奇" 

 1.在子组件(Chiled1)中用defineExpose()将要给的数据暴露出去。

 2.父组件用ref接收并修改

同理

父亲组件通过按钮将Child2组件的电脑"联想"修改成”华为“

跟上面步骤一样,就不赘述了

6.2在父组件用$ref修改所有子组件 

1.在父组件通过点击事件的$refs将所有的孩子组件的书都增添三本

 

 2.所有孩子组件都要将书这个数据暴露出去

6.3在子组件用$parent修改父组件

现在在Child1上通过一个按钮,将父亲的房产减一。

1.在点击事件上用$parent接收父组件实例

2.在父组件同样要暴露出来


Father.vue代码:

<template><div class="father"><h3>父组件</h3><h4>房产:{{ house }}</h4><button @click="changeToy">修改Child1的玩具</button><button @click="changeComputer">修改Child2的电脑</button><button @click="getAllChild($refs)">让所有孩子的书变多</button><Child1 ref="c1"/><Child2 ref="c2"/></div>
</template><script setup lang="ts" name="Father">import Child1 from './Child1.vue'import Child2 from './Child2.vue'import { ref,reactive } from "vue";let c1 = ref()let c2 = ref()// 数据let house = ref(4)// 方法function changeToy(){c1.value.toy = '小猪佩奇'}function changeComputer(){c2.value.computer = '华为'}function getAllChild(refs:{[key:string]:any}){console.log(refs)for (let key in refs){refs[key].book += 3}}// 向外部提供数据defineExpose({house})
</script><style scoped>.father {background-color: rgb(165, 164, 164);padding: 20px;border-radius: 10px;}.father button {margin-bottom: 10px;margin-left: 10px;}
</style>

 Child1.vue代码:

<template><div class="child1"><h3>子组件1</h3><h4>玩具:{{ toy }}</h4><h4>书籍:{{ book }} 本</h4><button @click="minusHouse($parent)">干掉父亲的一套房产</button></div>
</template><script setup lang="ts" name="Child1">import { ref } from "vue";// 数据let toy = ref('奥特曼')let book = ref(3)// 方法function minusHouse(parent:any){parent.house -= 1}// 把数据交给外部defineExpose({toy,book})</script><style scoped>.child1{margin-top: 20px;background-color: skyblue;padding: 20px;border-radius: 10px;box-shadow: 0 0 10px black;}
</style>

 Child2.vue代码:

<template><div class="child2"><h3>子组件2</h3><h4>电脑:{{ computer }}</h4><h4>书籍:{{ book }} 本</h4></div>
</template><script setup lang="ts" name="Child2">import { ref } from "vue";// 数据let computer = ref('联想')let book = ref(6)// 把数据交给外部defineExpose({computer,book})
</script><style scoped>.child2{margin-top: 20px;background-color: orange;padding: 20px;border-radius: 10px;box-shadow: 0 0 10px black;}
</style>

7.组件通信方式7-provide、inject

provide、inject的概念:

在Vue中,provide 和 inject 是一对用于实现祖先组件向后代组件传递数据的特殊选项。

首先,让我们来了解 provide。当你在祖先组件中使用 provide 选项时,你可以定义一些数据或方法,并将它们提供给后代组件。简单来说,provide 就像是祖先组件向后代组件提供了一些东西,就像你给孩子准备了一些礼物。

想象一下你有一个祖先组件,里面有一些数据或方法,你希望能够将它们传递给后代组件使用。你可以在祖先组件中使用 provide 选项来定义这些数据或方法,然后在后代组件中使用 inject 来接收它们。

接下来,我们来看看 inject。当你在后代组件中使用 inject 选项时,你可以接收祖先组件通过 provide 提供的数据或方法。简单来说,inject 就像是后代组件从祖先组件那里接收了一些礼物。

inject 是一个特殊选项,它允许你在后代组件中接收祖先组件提供的数据或方法。通过使用 inject,你可以像在后代组件中普通的数据属性一样使用这些从祖先组件传递过来的数据或方法。

使用 provide 和 inject 可以让你在组件层级结构中方便地共享数据或方法,而无需通过逐层传递 props 或事件来实现。这对于跨多个层级的组件之间的通信非常有用。

  1. 概述:实现祖孙组件直接通信

  2. 具体使用:

    • 在祖先组件中通过provide配置向后代组件提供数据

    • 在后代组件中通过inject配置来声明接收数据

这里创建三个组件

 此时需要建立这三个组件

1.父组件(Father.vue)

2.子组件(Child)

3.孙组件(GrandChild)

展现:

 在这里的子组件没什么作用,只是为了突出父组件可以直接传数据给孙组件时,可以不像$attrs一样要打扰到子组件。

7.1父组件给孙组件传数据

现在开始传数据啦

1.在父组件用provide提供数据给子组件

 2.在子组件用inject接收数据

注意:先把上面父组件的‘qian’ 换成‘money’,‘che’换成‘car’ 
前期是为了区分,现在不用了

 7.2孙组件给父组件传数据

现在在孙组件通过一个按钮可以修改父组件的money 

1.在父组件修改内容

补充:

在上面图的第二步,provide中,money不要加上.value,不然,就不会是响应式了

比如:

         

 2.在子组件中修改内容

显示:

 

 最后,子组件都没有用上,所以只是想告诉你,父组件给孙组件传递数据可以不影响子组件

父组件(Father.vue)代码:

<template><div class="father"><h3>父组件</h3><h4>银子:{{ money }}万元</h4><h4>车子:一辆{{car.brand}}车,价值{{car.price}}万元</h4><Child/></div>
</template><script setup lang="ts" name="Father">import Child from './Child.vue'import {ref,reactive,provide} from 'vue'let money = ref(100)let car = reactive({brand:'奔驰',price:100})function updateMoney(value:number){money.value -= value}// 向后代提供数据provide('moneyContext',{money,updateMoney})provide('car',car)</script><style scoped>.father {background-color: rgb(165, 164, 164);padding: 20px;border-radius: 10px;}
</style>

孙组件(GrandChild.vue)代码:

<template><div class="grand-child"><h3>我是孙组件</h3><h4>银子:{{ money }}</h4><h4>车子:一辆{{car.brand}}车,价值{{car.price}}万元</h4><button @click="updateMoney(6)">花爷爷的钱</button></div>
</template><script setup lang="ts" name="GrandChild">import { inject } from "vue";let {money,updateMoney} = inject('moneyContext',{money:0,updateMoney:(param:number)=>{}})let car = inject('car',{brand:'未知',price:0})
</script><style scoped>.grand-child{background-color: orange;padding: 20px;border-radius: 10px;box-shadow: 0 0 10px black;}
</style>

8.pinia

Vue3从入门到实战:掌握状态管理库pinia(上部分)-CSDN博客

Vue3从入门到实战:掌握状态管理库pinia(下部分)-CSDN博客

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

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

相关文章

C++进阶(2)-函数

目录 一、函数提高 1.1函数默认参数 1.2函数占位参数 1.3函数重载 1.3.1函数重载概述 1.3.2函数重载注意事项 二、类和对象 2.1封装 2.1.1封装的意义 2.1.2struct和class区别 2.1.3成员属性设置为私有 2.1.4封装案例 2.2对象的初始化和清理 2.2.1构造函数和析构函数 …

eNSP防火墙配置实验(trust、DMZ、untrust)

【拓扑】 设备 接口 IP地址/子网掩码/网关 AR1 G0/0/0 10.1.3.2/24 G0/0/1 100.1.1.2/24 FW1 G0/0/0 192.168.166.254/24 G1/0/0 10.1.1.1/24&#xff0c;trust域 G1/0/1 10.1.2.1/24&#xff0c;DMZ域 G1/0/2 100.1.3.1/24&#xff0c;untrust域 LSW1 G0/0/…

大孔树脂与凝胶型树脂的区别及应用

在工业和环境工程中&#xff0c;离子交换树脂被广泛用于处理水和废水&#xff0c;去除有害的化学物质。两种常见的离子交换树脂类型是大孔树脂和凝胶型树脂。尽管它们在功能上有所重叠&#xff0c;但在物理结构、性能和应用领域上存在显著差异。本文将探讨这两种树脂的特点、区…

微服务组件-注册中心

微服务组件-注册中心 使用restTemplate实现远程服务调用存在以下的问题&#xff1a; 1、消费者不知道如何获取服务提供者具体信息。 2、在远程调用的过程中&#xff0c;直接采用填写url的硬编码方式&#xff0c;如果服务消费者发生变化&#xff0c;得到的结果就会出错。 3、如果…

vue+element作用域插槽

作用域插槽的样式由父组件决定&#xff0c;内容却由子组件控制。 在el-table使用作用域插槽 <el-table><el-table-column slot-scope" { row, column, $index }"></el-table-column> </el-table>在el-tree使用作用域插槽 <el-tree>…

基于SpringBoot+Vue的二手车交易系统的设计与实现(源码+文档+包运行)

一.系统概述 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统二手车交易信息管理难度大&#xff0c;容错率低&…

初识ansible核心模块

目录 1、ansible模块 1.1 ansible常用模块 1.2 ansible-doc -l 列出当前anisble服务所支持的所有模块信息&#xff0c;按q退出 1.3 ansible-doc 模块名称 随机查看一个模块信息 2、运行临时命令 2.1 ansible命令常用的语法格式 3、常用模块详解与配置实例 3.1命令与…

​宁德时代:用一块电池玩转两个万亿赛道

2022 到 2023 连续两年&#xff0c;被称为国内储能行业的大储&#xff08;发电侧、电网侧&#xff09;元年和中储&#xff08;工商业&#xff09;元年&#xff0c;整个储能行业可谓是异常火爆&#xff0c;众多资本或企业纷纷涌入该赛道。 对于行业从业者来说&#xff0c;所从事…

力扣HOT100 - 206. 反转链表

解题思路&#xff1a; 迭代&#xff08;双指针&#xff09; class Solution {public ListNode reverseList(ListNode head) {ListNode cur head, pre null;while(cur ! null) {ListNode tmp cur.next; // 暂存后继节点 cur.nextcur.next pre; // 修改 next 引用指…

MOSFET效应管

【学习笔记】 金属氧化物半导体场效应晶体管&#xff08;Metal Oxide Semiconductor Field Effect Transistor&#xff0c;简称MOSFET&#xff09; MOSFET是三个端子器件&#xff0c;具有栅极、漏极和源极&#xff0c;栅极端子与漏极和源极之间的主导电流通道电气隔离&#xf…

连锁服装店用哪个进销存软件好

连锁服装店的进销存管理对于业务的高效运作至关重要&#xff0c;而选择合适的进销存软件能够极大地提升管理效率和经营水平。本文将介绍四款优秀的进销存软件&#xff0c;并重点关注商淘云连锁服装进销存管理系统&#xff0c;探讨其特点和优势。 1. 商淘云连锁服装进销存管理系…

喜报|炼石入选2024中国网络安全全景图 密码与数据安全六领

2024年4月12日&#xff0c;国内专业安全媒体安全牛发布《中国网络安全行业全景图&#xff08;第十一版&#xff09;》。第十一版全景图划分了16个一级安全分类和108个二级安全分类&#xff0c;汇集了510家安全厂商申报&#xff0c;实际收录为454家。全景图综合考量了产品的实用…

一文读懂uniapp中的tabBar底部导航

目录 1. 基本知识2. Demo 1. 基本知识 UniApp 中的 tabBar 是用来在应用程序底部显示可切换的选项卡的组件&#xff0c;通常用于实现底部导航栏 允许用户通过点击不同的选项卡来切换应用程序的不同页面或功能模块 其代码如下&#xff1a; "tabBar":{"color&q…

深入解析Rivest Cipher 4:理论与实践

title: 深入解析Rivest Cipher 4&#xff1a;理论与实践 date: 2024/4/17 20:30:58 updated: 2024/4/17 20:30:58 tags: 密码学RC4算法流密码密钥调度安全分析优缺点应用实践 第一章&#xff1a;引言 密码学简介&#xff1a; 密码学是研究如何保护通信和信息安全的学科。它涉…

# 从浅入深 学习 SpringCloud 微服务架构(一)基础知识

从浅入深 学习 SpringCloud 微服务架构&#xff08;一&#xff09;基础知识 1、系统架构演变&#xff1a; 1&#xff09;单体应用架构。如电商项目。 用户管理、商品管理、订单管理&#xff0c;在一个模块里。 优点&#xff1a;开发简单&#xff0c;快速&#xff0c;适用于…

React中redux、react-redux、@reduxjs/toolkit状态管理库的使用方式

效果 下载依赖 npm install redux react-redux reduxjs/toolkit --save在src目录下创建文件 创建index.ts文件 import { configureStore } from reduxjs/toolkit import userSlice from ./userReducerconst store configureStore({reducer: {user: userSlice.reducer} }) //…

代码随想录算法训练营第四十三天| LeetCode 1049.最后一块石头的重量II、494. 目标和、474.一和零

一、LeetCode 1049.最后一块石头的重量II 文章讲解/视频讲解&#xff1a;https://programmercarl.com/1049.%E6%9C%80%E5%90%8E%E4%B8%80%E5%9D%97%E7%9F%B3%E5%A4%B4%E7%9A%84%E9%87%8D%E9%87%8FII.html#%E6%80%9D%E8%B7%AF 状态&#xff1a;已解决 1.思路 其实这个题跟上个题…

ssm056基于Java语言校园快递代取系统的设计与实现+jsp

校园快递代取系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本校园快递代取系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短…

4核8G配置服务器多少钱?2024年阿里云服务器700元1年价格便宜

4核8G配置服务器多少钱&#xff1f;2024年阿里云服务器700元1年价格便宜。阿里云4核8G服务器租用优惠价格700元1年&#xff0c;配置为ECS通用算力型u1实例&#xff08;ecs.u1-c1m2.xlarge&#xff09;4核8G配置、1M到3M带宽可选、ESSD Entry系统盘20G到40G可选&#xff0c;CPU采…

Linux下的权限:论老流氓root的存在

文章目录 用户身份切换提权 权限管理文件访问者文件访问权限文件类型目录权限默认权限粘滞位 用户 Linux下有两中用户&#xff1a;超级用户&#xff08;root&#xff09;、普通用户 超级用户&#xff1a;可以在Linux系统下做任何事情&#xff0c;不受到限制普通用户&#xff…