Vue3 组件通信汇总

news2025/2/7 7:35:01

目录

    • 1、常见通信方式汇总:
    • 2、常用组件通信方式说明
      • 2.1 【props】
      • 2.2【自定义事件】
      • 2.3 【v-model】
      • 2.4 【$attrs 】
      • 2.5 【\$refs、\$parent】
      • 2.6 【provide、inject】

1、常见通信方式汇总:

Vue3组件通信和Vue2的区别:

  • 移出事件总线,使用mitt代替。
  • 使用pinia替换vuex
  • .sync优化到了v-model里面了。
  • $listeners所有的东西,合并到$attrs中了。
组件关系传递方式
父传子1.props
2. v-model
3.$refs
4. 默认插槽、具名插槽
子传父1.props
2. v-model
3.$parent
4. 自定义事件、作用域插槽
祖传孙、孙传祖1.¥attrs
2. provide、inject
兄弟间、任意组件间1.mitt
2. pinia

2、常用组件通信方式说明

2.1 【props】

  1. 概述:props是使用频率最高的一种通信方式,常用与 :父 ↔ 子
  • 父传子:属性值是非函数
  • 子传父:属性值是函数
  1. 代码示例
  • 父组件

    <template>
      <div class="father">
        <h3>父组件</h3>
    		<h4>父组件定义的变量:{{ car }}</h4>
    		<h4 v-show="toy">来自子组件的返回值:{{ toy }}</h4>
    		<Child :car="car" :sendToy="getToy"/>
      </div>
    </template>
    
    <script setup lang="ts" name="Father">
    	import Child from './Child.vue'
    	import {ref} from 'vue'
    	// 数据
    	let car = ref('父组件定义的变量:奔驰车')
    	let toy = ref('')
    	// 通过函数借子组件库调用 
    	function getToy(value:string){
    		toy.value = value
    	}
    </script>
    
  • 子组件

    	
    <template>
      <div class="child">
        <h3>子组件</h3>
        <h4>子组件自有变量:{{ toy }}</h4>
        <h4>来自父组件的props值:{{ car }}</h4>
        <button @click="sendToy(toy)">把玩具返回给父组件</button>
      </div>
    </template>
    <script setup lang="ts" name="Child">
    import { ref } from 'vue';
    // 声明接收props
    defineProps(['car', 'sendToy']);
    // 数据
    let toy = ref('我最受的玩具是奥特曼');
    </script>	
    

2.2【自定义事件】

  1. 概述:自定义事件常用于:子 => 父。,一般和props配套使用,在组件通信中使用频率较高。

  2. 代码示例

    <!--在父组件中,给子组件绑定自定义事件:-->	
    <Child @send-toy="saveToy"/>
    // 父组件中的saveToy方法
    function saveToy(value:string){
    	toy.value = value
    }
    
    <!--子组件,事件声明与触发-->	
    //子组件中,声明事件:
    const emit =  defineEmits(['send-toy'])
    // 事件触发
    emit('send-toy',toy)	
    

2.3 【v-model】

  1. 概述:实现 父↔子 之间相互通信。
  2. v-model的本质
    组件标签上的v-model的本质::moldeValueupdate:modelValue事件的组合。
    <!-- 组件标签上使用v-model指令 -->
    <child v-model="userName"/>
    
    <!-- 组件标签上v-model等价于下面的示例 -->
    <child :modelValue="userName" @update:model-value="userName = $event"/>
    
  3. 代码示例
    父组件
    <template>
      <div class="father">
        <h3>父组件</h3>
        <!-- 修改modelValue -->
        <Child v-model:name="book" v-model:price="price" />
      </div>
    </template>
    <script setup lang="ts" name="Father">
    import { ref } from 'vue';
    import Child from './child.vue';
    // 数据
    let book = ref('三国演示');
    let price = ref(90);
    </script>
    

子组件代码

<template>
  <div class="child">
    <h3>子组件</h3>
    <input type="text" :value="name" @input="changeName((<HTMLInputElement>$event.target).value)" />
    <br />
    <input type="text" v-model="childPrice" @input="changePrice(childPrice)" />
  </div>
</template>
<script setup lang="ts" name="AtguiguInput">
// 接收props参数
const props = defineProps(['name', 'price']);
// 事件定义
const emit = defineEmits(['update:name', 'update:price']);
// 子组件变量声明
let childPrice = props.price;
function changeName(val: string) {
  emit('update:name', val);
}
function changePrice(val: number) {
  emit('update:price', val);
}
</script>

2.4 【$attrs 】

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

  2. 具体说明:$attrs是一个对象,包含所有父组件传入的标签属性。

    注意:$attrs会自动排除props中声明的属性(可以认为声明过的 props 被子组件自己“消费”了)

  3. 代码示例

 <!-- 子组件传值 -->
 <Child :a="a" :b="b" :c="c" :d="d" v-bind="{x:100,y:200}" :updateA="updateA"/>

<!-- 子组件中通过$attrs传导 -->
<GrandChild v-bind="$attrs"/>

<!-- 孙组件中使用 -->
defineProps(['a','b','c','d','x','y','updateA'])

2.5 【$refs、$parent】

  1. 概述:

    • $refs用于 :父→子。
    • $parent用于:子→父。
  2. 原理如下:

    属性说明
    $refs值为对象,包含所有被ref属性标识的DOM元素或组件实例。
    $parent值为对象,当前组件的父组件实例对象。
  3. 注意事项
    通过$refs$parent访问时,需要在相应组件中通过defineExpose把要操作的变量或函数暴露出来,否则访问不到相关变量与函数。

2.6 【provide、inject】

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

  2. 具体使用:

    • 在祖先组件中通过provide配置向后代组件提供数据
    • 在后代组件中通过inject配置来声明接收数据
  3. 核心代码示例

  // 向后代提供数据
  provide('moneyContext',{money,updateMoney})
  provide('car',car)

  // 在需要使用的组件中进行接收
   let {money,updateMoney} = inject('moneyContext',{money:0,updateMoney:(param:number)=>{}})
   let car = inject('car',{brand:'未知',price:0})

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

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

相关文章

nginx伪静态配置解释和Nginx 常见的配置

文章目录 禁止访问 runtime 和 application 目录rewrite 对 URL 进行重写或重定向301重定向root 静态资源路径处理alias 路径映射try_files 伪静态规则Nginx 配置有许多其他常见的场景和使用方式 1. **基本的反向代理配置**2. **负载均衡配置**3. **限制访问&#xff08;IP 限…

AI安全最佳实践:AI云原生开发安全评估矩阵(下)

上篇小李哥带大家一起了解了什么是AI应用云原生开发安全评估矩阵&#xff0c;并且介绍了利用该矩阵如何确定我们云上AI应用的安全评估范围&#xff0c;接下来我们将继续本系列的下篇&#xff0c;基于该安全评估矩阵设计和实施我们系统应具备的安全控制。 优先考虑的安全控制 …

Windows DeepSeek API调用基础教程-Python

DeepSeek API 调用&#x1f680; 在最近DeepSeek大火之后&#xff0c;在各个媒体上都能看到对这个大模型的报道&#xff0c;这个使用MoE的架构的大模型&#xff0c;在使用体验上&#xff0c;确实让我眼前一亮&#xff0c;我自己平时也是已经在用着GPT-o1&#xff0c;对比下来发…

达梦数据库从单主模式转换为主备模式

目录标题 达梦数据库单主转主备配置笔记前期准备服务器环境数据库安装磁盘空间 流程流程图说明 详细步骤1. 检查主库归档模式2. 配置主库配置文件dm.ini 文件dmmal.ini 文件dmarch.ini 文件 3. 备份主库数据库4. 备库配置新建备库数据库配置备库配置文件dm.ini 文件复制主库的 …

SpringUI Web高端动态交互元件库

Axure Web高端动态交互元件库是一个专为Web设计与开发领域设计的高质量资源集合&#xff0c;旨在加速原型设计和开发流程。以下是关于这个元件库的详细介绍&#xff1a; 一、概述 Axure Web高端动态交互元件库是一个集成了多种预制、高质量交互组件的工具集合。这些组件经过精…

ES冷热数据分离配置

冷热数据是根据索引创建时间来进行迁移的。一旦迁移到冷数据节点&#xff0c;则无法再恢复成热数据&#xff0c;因为热数据节点中该索引已经没有分片存在了。 基于Docker搭建ES集群,并设置冷热数据节点 配置冷热数据迁移策略 PUT https://192.168.x.xx:19200/_ilm/policy/my…

七大排序思想

目录 七大排序的时间复杂度和稳定性 排序 插入排序 简单插入排序 希尔排序 选择排序 简单选择排序 堆排序 交换排序 冒泡排序 快速排序 快排的递归实现 hoare版本的快排 挖坑法的快排 双指针法的快排 快排的非递归 归并排序 归并的递归实现 归并的非递归实现…

制作PE启动盘(内含Win11 iso镜像)

前言 本文用于记录制作PE启动盘过程&#xff0c;学习记录用&#xff0c;如有不对请指出&#xff0c;谢谢&#xff01; 参考视频&#xff1a; 1. 微PE下载&#xff1a;https://www.bilibili.com/video/BV1vT4y1n7JX/?spm_id_from333.788.top_right_bar_window_history.conte…

css字体样式与文本样式详解

目录 一、CSS字体样式 1. 字体类型&#xff08;font-family&#xff09; 2. 字体大小&#xff08;font-size&#xff09; 3. 字体粗细&#xff08;font-weight&#xff09; 4. 字体风格&#xff08;font-style&#xff09; 5. 字体颜色&#xff08;color&#xff09; 6. …

游戏引擎学习第89天

回顾 由于一直没有渲染器&#xff0c;终于决定开始动手做一个渲染器&#xff0c;虽然开始时并不确定该如何进行&#xff0c;但一旦开始做&#xff0c;发现这其实是正确的决定。因此&#xff0c;接下来可能会花一到两周的时间来编写渲染器&#xff0c;甚至可能更长时间&#xf…

Linux学习笔记16---高精度延时实验

延时函数是很常用的 API 函数&#xff0c;在前面的实验中我们使用循环来实现延时函数&#xff0c;但是使用循环来实现的延时函数不准确&#xff0c;误差会很大。虽然使用到延时函数的地方精度要求都不会很严格( 要求严格的话就使用硬件定时器了 ) &#xff0c;但是延时函数肯定…

杨氏数组中查找某一数值是否存在

判断数据是否存在于杨氏矩阵中 &#xff08;小米真题&#xff09; 题目&#xff1a;有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 要求&#xff1a;时间复杂度小于O(N) …

51单片机 02 独立按键

一、独立按键控制LED亮灭 轻触按键&#xff1a;相当于是一种电子开关&#xff0c;按下时开关接通&#xff0c;松开时开关断开&#xff0c;实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。 #include <STC89C5xRC.H> void main() { // P20xFE;while(1){…

AI + 编程时代,飞算JavaAI如何引领行业趋势变革

在当今科技飞速发展的浪潮下&#xff0c;AI 与编程的深度融合已成为不可阻挡的时代趋势&#xff0c;正重塑着各个行业的格局。在这场变革中&#xff0c;飞算JavaAI脱颖而出&#xff0c;凭借其卓越的特性和创新的理念&#xff0c;在 AI 编程领域展现出强大的引领力量&#xff0…

Deepseek本地部署指南:在linux服务器部署,在mac远程web-ui访问

1. 在Linux服务器上部署DeepSeek模型 要在 Linux 上通过 Ollama 安装和使用模型&#xff0c;您可以按照以下步骤进行操作&#xff1a; 步骤 1&#xff1a;安装 Ollama 安装 Ollama&#xff1a; 使用以下命令安装 Ollama&#xff1a; curl -sSfL https://ollama.com/download.…

1-R语言概述

1.认识R语言 1.1 选择R语言的依据 免费的软件编程方便&#xff0c;语言灵活&#xff0c;图形功能强大优秀的内在帮助系统高质量、广泛的统计分析、数据挖掘平台国际上R语言已然是专业数据分析领域的标准 1.2 R的来源 ​ R是S语言的一种实现。S语言是由 AT&T贝尔实验室…

【BQ3568HM开发板】智能家居中控屏连接华为云IoTDA物联网平台

目录 引言 安装OpenHarmony的MQTT库 华为云平台的操作 建立设备 建立物模型 连接华为云平台 发布LED灯状态 代码重构 测试结果 接收平台发送的属性修改命令 设备侧API Topic 下行请求参数说明 上行响应参数说明 程序修改 应用侧API 测试设备属性设置功能 结语…

java 8 在 idea 无法创建 java spring boot 项目的 变通解决办法

java 8 在 idea 无法创建 java spring boot 项目的 变通解决办法 spring boot 3 官方强制 要用 java 17 &#xff0c;但是 不想安装java 17的 &#xff0c;但是又想 使用 spring boot &#xff0c;可以这样 &#xff1a; 在这个网站 https://start.aliyun.com/ 选择 你相对…

web-文件上传-CTFHub

前言 在众多的CTF平台当中&#xff0c;作者认为CTFHub对于初学者来说&#xff0c;是入门平台的不二之选。CTFHub通过自己独特的技能树模块&#xff0c;可以帮助初学者来快速入门。具体请看官方介绍&#xff1a;CTFHub。 作者更新了CTFHub系列&#xff0c;希望小伙伴们多多支持…

SQLAlchemy-2.0中模型定义和alembic的数据库迁移工具

SQLAlchemy-2.0中模型定义和alembic的数据库迁移工具 一、SQLAIchemy的介绍二、数据库引擎1、支持的数据库1.1、sqlite数据库1.2、MySQL数据库1.3、数据库引擎的参数 三、定义模型类1、定义模型2、engine负责数据库迁移 四、alembic数据库迁移⼯具1、安装alembic2、初始化alemb…