vue3组件通信(二)

news2024/9/9 1:40:26

组件通信

  • 一.$attrs(祖=>孙间接)
  • 二、$refs()父=>子, $parent()子=>父
  • 三.provide,inject(祖=>孙直接)
  • 四.pinia
  • 五.slot
    • 1.默认插槽
    • 2.具名插槽
    • 3.作用域插槽

一.$attrs(祖=>孙间接)

$attrs用于实现当前组件的父组件,向当前组件的子组件通信(祖→孙)。
$ attrs是一个对象,包含所有父组件传入的标签属性。
注意:$attrs会自动排除props中声明的属性(可以认为声明过的 props 被子组件自己“消费”了)
和props用法差不多
父组件

<template>
  <div class="father">
    <h3>父组件</h3>
		<Child :a="a" :b="b" :c="c" :d="d" v-bind="{x:100,y:200}" :updateA="updateA"/>
  </div>
</template>

<script setup lang="ts" name="Father">
	import Child from './Child.vue'
	import { ref } from "vue";
	let a = ref(1)
	let b = ref(2)
	let c = ref(3)
	let d = ref(4)

	function updateA(value){
		a.value = value
	}
</script>

子组件:

<template>
	<div class="child">
		<h3>子组件</h3>
		<GrandChild v-bind="$attrs"/>
	</div>
</template>

<script setup lang="ts" name="Child">
	import GrandChild from './GrandChild.vue'
</script>

孙组件

<template>
	<div class="child">
		<h3>子组件</h3>
		<GrandChild v-bind="$attrs"/>
	</div>
</template>

<script setup lang="ts" name="Child">
	import GrandChild from './GrandChild.vue'
</script>

二、$refs()父=>子, $parent()子=>父

$ refs父亲拿取孩子的数据,$parent孩子拿取父亲的数据
1.原理
$refs:值为对象,包含所有被ref属性标识的DOM元素或组件实例。
$parent:值为对象,当前组件的父组件实例对象。
2.传递数据的需要把数据暴露出来才能被用
用defineExpose()暴露

// 宏函数把数据交给外部
defineExpose({ toy, book })

父组件

<template>
	<div class="father">
		<h3>父组件</h3>
		<h4>房产:{{ house }}</h4>
		<button @click="changeToy">修改Child1的玩具</button>
		<button @click="getAllChild($refs)">让所有孩子的书变多</button>
		<Child1 ref="c1"/>
	</div>
</template>

<script setup lang="ts" name="Father">
	import Child1 from './Child1.vue'
	import { ref,reactive } from "vue";
	let c1 = ref()
	// 数据
	let house = ref(4)
	// 方法
	function changeToy(){
		c1.value.toy = '小猪佩奇'
	}
	function getAllChild(refs:{[key:string]:any}){
		console.log(refs)
		for (let key in refs){
			refs[key].book += 3
		}
	}
	// 向外部提供数据
	defineExpose({house})
</script>

子组件

<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>

三.provide,inject(祖=>孙直接)

具体使用:
在祖先组件中通过provide配置向后代组件提供数据
在后代组件中通过inject配置来声明接收数据
祖组件:

<template>
  <div class="father">
    <h3>父组件</h3>
    <h4>资产:{{ money }}</h4>
    <h4>汽车:{{ car }}</h4>
    <button @click="money += 1">资产+1</button>
    <button @click="car.price += 1">汽车价格+1</button>
    <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
  })
  // 用于更新money的方法
  function updateMoney(value:number){
    money.value += value
  }
  // 提供数据
  provide('moneyContext',{money,updateMoney})
  provide('car',car)
</script>

孙组件:

<template>
  <div class="grand-child">
    <h3>我是孙组件</h3>
    <h4>资产:{{ money }}</h4>
    <h4>汽车:{{ car }}</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:(x:number)=>{}})
  let car = inject('car')
</script>

四.pinia

参考之前的笔记

五.slot

1.默认插槽

父组件中:
        <Category title="今日热门游戏">
          <ul>
            <li v-for="g in games" :key="g.id">{{ g.name }}</li>
          </ul>
        </Category>
子组件中:
        <template>
          <div class="item">
            <h3>{{ title }}</h3>
            <!-- 默认插槽 -->
            <slot></slot>
          </div>
        </template>

2.具名插槽

父组件中:
        <Category title="今日热门游戏">
          <template v-slot:s1>
            <ul>
              <li v-for="g in games" :key="g.id">{{ g.name }}</li>
            </ul>
          </template>
            
          <template #s2>
            <a href="">更多</a>
          </template>
        </Category>
子组件中:
        <template>
          <div class="item">
            <h3>{{ title }}</h3>
            <slot name="s1"></slot>
            <slot name="s2"></slot>
          </div>
        </template>

3.作用域插槽

数据在组件的自身(子组件),但根据数据生成的结构需要组件的使用者(父组件)来决定。(新闻数据在News组件中,但使用数据所遍历出来的结构由App组件决定)

父组件中:
      <Game v-slot="params">
      <!-- <Game v-slot:default="params"> -->
      <!-- <Game #default="params"> -->
        <ul>
          <li v-for="g in params.games" :key="g.id">{{ g.name }}</li>
        </ul>
      </Game>

子组件中:
      <template>
        <div class="category">
          <h2>今日游戏榜单</h2>
          <slot :games="games" a="哈哈"></slot>
        </div>
      </template>

      <script setup lang="ts" name="Category">
        import {reactive} from 'vue'
        let games = reactive([
          {id:'asgdytsa01',name:'英雄联盟'},
          {id:'asgdytsa02',name:'王者荣耀'},
          {id:'asgdytsa03',name:'红色警戒'},
          {id:'asgdytsa04',name:'斗罗大陆'}
        ])
      </script>

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

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

相关文章

语音转文字在线免费有什么工具?这4款工具让记录更高效

在当今职场、学术界和内容创作领域&#xff0c;人们越来越需要一种高效的方式来整理会议记录、讲座内容或采访对话。 幸运的是&#xff0c;除了传统的手动记笔记方式&#xff0c;我们还可以通过录音转文字软件来实现这一目标。这些软件能够直接将音频资料转写为文本&#xff0…

4nm点状激光模组的应用让未来科技走向潮流

在科技发展时代&#xff0c;激光技术以其高精度、高效率的特性&#xff0c;正逐步成为众多行业不可或缺的核心技术之一。其中&#xff0c;4nm点状激光模组作为激光技术领域的佼佼者&#xff0c;凭借其卓越的性能和广泛的应用前景&#xff0c;正引领着科技发展的新潮流。接下来我…

ubuntu20.04.6 安装Skywalking 10.0.1

1.前置准备 1.1. **jdk17&#xff08;Skywalking10 jdk22不兼容&#xff0c;用17版本即可&#xff09;**安装&#xff1a; https://blog.csdn.net/CsethCRM/article/details/140768670 1.2. elasticsearch安装&#xff1a; https://blog.csdn.net/CsethCRM/article/details…

Apollo:源码分析之cyber/mainboard启动入口介绍-my write, test ok

软件结构图 cyber入口 cyber的入口在"cyber/mainboard"目录中: ├── mainboard.cc // 主函数 ├── module_argument.cc // 模块输入参数 ├── module_argument.h ├── module_controller.cc // 模块加载,卸载 └── module_controller.…

Feature Corrective Transfer Learning (2024CVPR)

Feature Corrective Transfer learning Framework &#xff08;特征矫正迁移学习框架&#xff09; 旨在引导非理想图像上的模型训练与理想图像上训练的模型的特中层更紧密地对齐 Model Selection and Training on Ideal Images 首先在理想图像上训练&#xff0c;得到理想参数…

NV170D语音芯片:为洗地扫地一体机带来新体验!

随着物联网、人工智能技术的飞速发展&#xff0c;家用电器的智能化转型已成为不可逆转的趋势。在这一背景下&#xff0c;洗地扫地一体机&#xff0c;作为家务自动化的先锋&#xff0c;融合了高效清洁与便捷操作的双重优势&#xff0c;而语音芯片的应用&#xff0c;更是为其增添…

使用 nvm在linux上安装多个版本的node

使用 nvm&#xff08;Node Version Manager&#xff09;: nvm 是一个流行的 Node.js 版本管理工具&#xff0c;允许你安装和使用多个版本的 Node.js。 1、安装nvm wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash source ~/.nvm/nvm.sh2、…

javaEE(3)

目录 一. 前端浏览器保存用户信息 二. 前端路由导航守卫 三. 路由嵌套 四. web会话跟踪 1. web会话跟踪原理 2. JWT 2.1 传统的session认证 2.2 基于token的鉴权机制 2.3 jwt的构成 2.4 jwt搭建 五. 前端发送请求携带token 5.1 请求拦截器 六. 后端过滤器验证toke…

springboot合肥师范学院实习实训管理系统-计算机毕业设计源码31290

摘要 随着社会对高校毕业生的职业素养和实践能力要求不断提高&#xff0c;高校实习实训教育愈发受到重视。信息化技术的快速发展也为高校教学管理带来了新的机遇。合肥师范学院实习实训管理系统的研究就是源自当前高等教育对学生实习实训管理的需求。 实习实训管理系统充分利用…

手机录屏直播,教你3个方法,秒变录屏高手

在移动互联网飞速发展的今天&#xff0c;手机录屏直播已成为越来越多用户分享内容、交流心得的重要方式。无论是游戏高手展示高超技艺&#xff0c;还是教育从业者进行远程授课&#xff0c;手机录屏直播都能提供极大的便利。 在手机录屏的世界里&#xff0c;安卓手机和苹果手机…

深入分析 Android ContentProvider (九)

文章目录 深入分析 Android ContentProvider (九)ContentProvider 的高级使用及最佳实践&#xff08;续&#xff09;1. 复杂查询与联合查询复杂查询示例 2. 数据同步与一致性示例&#xff1a;使用事务确保数据一致性 3. 数据分页加载示例&#xff1a;分页加载数据 4. 内容提供者…

jmeter录制

1、添加代理服务器 添加方法&#xff1a;“测试计划”右键 -> 添加 -> 非测试元件 -> HTTP代理服务器 2、添加线程组 添加方法&#xff1a;“测试计划”右键->添加->线程&#xff08;用户&#xff09;->线程组 3、配置http代理服务器 &#xff08;1&a…

电脑录屏软件带声音,3款软件推荐,一键录制

在今天&#xff0c;电脑录屏软件带声音的功能已经悄然改变了我们的学习、工作和娱乐方式。录屏软件&#xff0c;这个看似简单的工具&#xff0c;实则蕴藏着无穷的魅力。它不仅能够捕捉屏幕上的每一个细节&#xff0c;还能将声音完美地融入其中。无论是游戏中的背景音乐、会议中…

谷粒商城实战笔记-77-商品服务-API-平台属性-规格参数列表

文章目录 一&#xff0c;新增product/attr/base/list接口二&#xff0c;踩坑记录1. 使用 Lazy 注解2. 使用 PostConstruct 注解代码分析解决方案分析 这一节的主要内容是完成规格参数的列表查询功能。 一&#xff0c;新增product/attr/base/list接口 这个接口用来查询规格参数…

电力巡检红外热成像夜视手持终端有多强?

电力巡检红外热成像夜视手持终端在电力巡检中展现出强大的功能和应用价值。这些手持终端结合了红外热成像技术和夜视功能&#xff0c;能够在夜间或光线不足的环境下对电力设备进行精确的温度测量和状态监测。以下是对其强大之处的详细分析&#xff1a; 1. 精准的红外热成像能力…

【机器学习】正规方程的简单介绍以及如何使用Scikit-Learn实现基于正规方程的闭式解线性回归

引言 Scikit-learn 是一个开源的机器学习库&#xff0c;它支持 Python 编程语言。它提供了多种机器学习算法的实现&#xff0c;并用于数据挖掘和数据分析 文章目录 引言一、正规方程的定义二、正规方程的原理三、使用 Scikit-Learn 实现基于正规方程的闭式解线性回归3.1 工具3.…

爬虫“拥抱大模型”,有没有搞头?

验证码坐标识别 数据采集过程中&#xff0c;可能会碰到各种风控策略。其中&#xff0c;验证码人机验证是较为常见的&#xff0c;点选类验证码需要识别出相应的坐标&#xff0c;碰到这种情况&#xff0c;一般要么自己训练模型&#xff0c;要么对接打码平台。现在也可以将识别工…

RocketMQ事务消息机制原理

RocketMQ工作流程 在RocketMQ当中&#xff0c;当消息的生产者将消息生产完成之后&#xff0c;并不会直接将生产好的消息直接投递给消费者&#xff0c;而是先将消息投递个中间的服务&#xff0c;通过这个服务来协调RocketMQ中生产者与消费者之间的消费速度。 那么生产者是如何…

领夹麦哪个牌子音质好?直播采访十大公认音质好的麦克风!

在追求内容品质的今天&#xff0c;音频质量成为了衡量作品成功与否的关键指标之一。对于频繁出镜的互联网从业者、短视频创作者及直播达人而言&#xff0c;一款性能卓越的无线领夹麦克风无疑是提升专业形象的得力助手。它不仅轻便易携&#xff0c;更能在复杂环境中捕捉纯净、清…

[QT开发_音乐播放器项目笔记01]

目录 一&#xff1a;常用类 26 QByteArray 是 Qt 框架中的一个类&#xff0c;用于处理字节数组。它提供了动态大小的字节数组&#xff0c;可以用于存储和操作二进制数据&#xff0c;比如文件内容、网络数据等。 QT项目记录&#xff1a; 一&#xff1a;常用类 26 QByteArray…