Vue3之属性传值的四种情况

文章目录

  • Vue3之属性传值的四种情况
    • 一、引言
    • 二、父组件向子组件传值
    • 三、子组件向父组件传值
    • 四、祖先组件向后代组件传值
    • 五、兄弟组件之间传值

Vue3之属性传值的四种情况

一、引言

在vue3中,组件与组件之间是可以传递属性的,包括三种类型:

  • 父组件向子组件传值
  • 子组件向父组件传值
  • 祖先组件向后代组件传值
  • 兄弟组件之间传值

本篇文章来分析一下他们分别是如何实现的?

本篇文章均采用vue3+ts格式书写

二、父组件向子组件传值

首先,在父组件中子组件标签上 加上自定义的属性名称以及对应的数据,如下:

<Header class="xm-header" :title="data"></Header>

这里,我们自定义属性名为title,属性值为data,注意data为响应式数据

其次,在子组件中要去通过defineProps()方法接收这个值,

const props = defineProps<{title: string
}>()

这里使用的是ts写法,父组件传递的值会被封装成一个对象,在<>中写上对象的类型推断,即可取到值。

这里我们可以看一下props的内容

在这里插入图片描述

且看源码可以知道,这个返回的对象是一个只读属性,readonly是Vue3中提供的一个新特性,用于将一个响应式对象变成只读对象。

export declare function defineProps<TypeProps>(): DefineProps<LooseRequired<TypeProps>, BooleanKey<TypeProps>>;
export type DefineProps<T, BKeys extends keyof T> = Readonly<T> & {readonly [K in BKeys]-?: boolean;
};

它的返回值是Readonly,且这个泛型T是我们传进去的ts类型

{title: string}

一个普通的object对象,而在template中可以使用两种方式获取到title的值

  1. 直接使用{{props.title}}
  2. {{title}}

第二种方式我也不知道为什么可以直接使用,希望有大佬在评论区解答一下

存在一种情况,就是父组件没有传值,但是我希望有个默认值,可以使用withDefault()方法

withDefaults(defineProps<{title: string
}>(),{ title: '默认标题' }
)

第一个参数传defineProps()方法,第二个参数传一个对象,这个对象中,还能这样使用:

{title:()=>"默认标题"}

三、子组件向父组件传值

子组件向父组件中传值使用defineEmits()方法,它的作用是在使用emits声明由组件触发的自定义事件时获得完整的类型推导。

const emit = defineEmits<{//在父组件中自定义的返回事件的名称,name是方法的参数,其对应类型为传递的值的类型onClick:[name:string]
}>()

注:这里声明的onClick不能使用on-click的形式,会报错

同时还要在子组件中声明一个事件,实现动态传递值,比如说你定义一个按钮,其执行的函数是send函数。

const send = () => {emit("onClick","gunala")
}

这里可以使用emit方法,注意:这个方法是defineEmits的返回值。

第一个参数是:在父组件中自定义的返回事件的名称;第二个参数是:要传递的数值

最后一步,在父组件中接收返回的自定义函数

<Header class="xm-header" :title="data" @onClick="name"></Header>

这里name是一个函数,需要在父组件中定义声明。

const name = (target:string):void=>{//这个target就是我们传递的值console.log(target);
}

在这里插入图片描述

四、祖先组件向后代组件传值

如果爷爷组件想向孙子组件传值的话,以前是要先向父亲组件传值,再由父亲组件向儿子组件传值

vue3提供了一种简便的方式:provide()和inject()

前提,在setup阶段调用,即在中使用。

比如,我现在想向子孙组件中传递一个参数,改变子孙组件中的一个div块的背景色

//祖先组件
import { ref, provide } from 'vue'
const color = ref("yellow")
provide("color", color)

在子孙组件中接收参数

//子孙组件
<script setup lang="ts">import { inject } from 'vue';//引入ts中的Ref类型的声明import type { Ref } from 'vue';const color = inject<Ref<string>>('color')
</script>

其次可以在子孙组件中的style样式中直接获取到color值,使用v-bind

.box {width: 100px;height: 100px;background-color: v-bind(color);
}

五、兄弟组件之间传值

Vue3中推荐使用第三方库 mitt 作为兄弟组件传值的媒介,不再需要找到父组件作为传值的媒介,提高服务性能。

使用方法:

  1. 安装mitt库
npm run mitt -S
  1. 在main.ts中注册为全局配置属性
import App from "./App.vue";
//引入mitt
import mitt from "mitt"
const Mitt = mitt();export const app = createApp(App);
//配置全局属性,属性名:$Bus
app.config.globalProperties.$Bus = Mitt;

这样直接使用,在后面会没有类型推导和提示,可以声明$Bus的类型。

declare module "vue" {//用于声明全局属性类型export interface ComponentCustomProperties {$Bus: typeof Mitt;}
}
  1. 在组件中使用

我在这里声明了两个兄弟组件,他们在一个父亲组件中被引用

在这里插入图片描述

我在A组件中写了一个按钮,其功能是向B组件传值,

<template><div><h2>A组件</h2><el-button type="primary" @click="send">传值</el-button></div>
</template><script lang="ts" setup>//getCurrentInstance方法是获取当前对象的实例,方便从全局配置属性拿值import { getCurrentInstance } from 'vue';//getCurrentInstance()中有两个属性:ctx 是普通对象,proxy 是 Proxy 对象const instance = getCurrentInstance()const send = () => {//emit方法是传值,第一个属性是事件名,第二个是值instance?.proxy?.$Bus.emit('data', 'Hello from A')}
</script><style scoped> 
</style>

在B组件监听接收A组件传来的值

<script lang="ts" setup>import { getCurrentInstance } from 'vue';const instance = getCurrentInstance()//on()方法是监听函数,监听是否接受到第一个事件名instance?.proxy?.$Bus.on('data', (data: string) => {console.log('B组件接收到数据:', data);})</script>

这里来看一下结果:

在这里插入图片描述

也可以监听所有事件:“*”

<script lang="ts" setup>import { getCurrentInstance } from 'vue';const instance = getCurrentInstance()//on()方法是监听函数,监听是否接受到第一个事件名,函数的第一个属性type是监听到的事件名称,data是传递的值instance?.proxy?.$Bus.on('*', (type:string,data: string) => {console.log('B组件接收到来自',type,'的数据:', data);})</script>

在这里插入图片描述

取消对某个事件的监听:

// 需要取消指定事件的监听,需要将回调定义在外部
const Fn =  (data: string) => {console.log('B组件接收到数据:', data);
}
instance?.proxy?.$Bus.on('data',Fn)
instance?.proxy?.$Bus.off('data',Fn)

清除所有事件的监听:

instance?.proxy?.$Bus.all.clear()

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

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

相关文章

电商风控系统(flink+groovy+flume+kafka+redis+clickhouse+mysql)

一.项目概览 电商的防止薅羊毛的风控系统 需要使用 groovy 进行风控规则引擎的编写 然后其它技术进行各种数据的 存储及处理 薅羊毛大致流程 如果单纯使用 if else在业务代码中进行风控规则的编写 那么 维护起来会比较麻烦 并且跟业务系统强绑定不合适 所以一般独立成一个单…

【Python笔记-设计模式】中介者模式

一、说明 中介者模式是一种行为设计模式&#xff0c;减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互&#xff0c;迫使它们通过一个中介者对象进行合作。 (一) 解决问题 降低系统中对象之间的直接通信&#xff0c;将复杂的交互转化为通过中介者进行的间接交…

[Mac软件]Adobe Substance 3D Stager 2.1.4 3D场景搭建工具

应用介绍 Adobe Substance 3D Stager&#xff0c;您设备齐全的虚拟工作室。在这个直观的舞台工具中构建和组装 3D 场景。设置资产、材质、灯光和相机。导出和共享媒体&#xff0c;从图像到 Web 和 AR 体验。 处理您的最终图像 Substance 3D Stager 可让您在上下文中做出创造性…

绝对路径拼接漏洞 [NISACTF 2022]babyupload

打开题目 最开始以为是文件上传的漏洞 结果发现无论我们上传什么文件都会显示bad filename 去网上看了大佬的wp知道 我们直接去看源代码得到提示 /source 那我们去访问一下这个路径看看 得到一个下载文件 用记事本打开得到 源代码如下 from flask import Flask, request, r…

SSL OV证书和DV、EV证书的区别

在网站搭建的过程中和小程序开发过程中&#xff0c;很难免会有需要用到SSL证书的地方&#xff0c;但是目前数字证书种类繁多&#xff0c;该选择什么类型的证书成为了一个令人纠结的问题。 目前在市场上较为常见的证书分为三种&#xff1a;DV域名验证型证书&#xff1b;OV组织验…

iPhone利用文件管理器批量导出语音备忘录和照片到电脑

步骤1&#xff1a;使用文件服务器在 iPhone 和电脑间共享文件 参考文献&#xff1a;苹果官网操作指南 步骤1.1&#xff1a;iPhone上打开文件app&#xff0c;点击右上角三个点&#xff0c;选择“连接服务器” 步骤1.2&#xff1a;输入电脑的登录账号和密码 步骤1.3&#xff1a…

LVGL 环境搭建-基于WSL

背景说明 小白刚开始接触LVGL&#xff0c;前些日子狠心花198元入手了一块堪称LVGL 入门利器~HMI-Board 开发板&#xff0c;虽然有RT-Thread 集成好的LVGL 环境&#xff0c;只需要几个步骤就能成功把lvgl 的示例运行起来&#xff0c;对于爱折腾的我来说&#xff0c;过于简单也并…

【UE 材质】冰冻效果

效果 步骤 1. 打开“Quixel Bridge” 下载冰的纹理 2. 新建一个材质&#xff0c;这里命名为“M_Frozen” 打开“M_Frozen”&#xff0c;添加如下节点&#xff0c;此时我们可以通过控制参数“偏移”来改变边界的偏移 此时预览效果如下 如果增加参数“偏移”的默认值效果如下 3.…

动态规划课堂2-----路径问题

目录 引言&#xff1a; 例题1&#xff1a;不同路径 例题2&#xff1a;不同路径II 例题3&#xff1a;礼物的最⼤价值 例题4&#xff1a;下降路径最⼩和 例题5&#xff1a;最小路径和 结语&#xff1a; 引言&#xff1a; 在学习完动态规划斐波那契数列模型后&#xff0c;…

QT GUI编程常用控件学习

1 GUI编程应该学什么 2 QT常用模块结构 QtCore: 包含了核心的非GUI的功能。主要和时间、文件与文件夹、各种数据、流、URLs、mime类文件、进程与线程一起使用 QtGui: 包含了窗口系统、事件处理、2D图像、基本绘画、字体和文字类 QtWidgets: 包含了一些列创建桌面应用的UI元素…

input输入框过滤非金额内容保留一个小数点和2位小数

这篇是输入框过滤非金额内容保留一个小数点和2位小数&#xff0c;金额的其他格式化可以看这篇文章常用的金额数字的格式化方法 js方法直接使用 该方式可以直接使用过滤内容&#xff0c;也可以到onInput或onblur等地方过滤&#xff0c;自行使用 /*** 非金额字符格式化处理* p…

安全测试工具之nmap使用指南

文章目录 一、前言二、简介三、使用示例&#xff08;一&#xff09;常用命令&#xff08;二&#xff09;主机存活检测&#xff08;三&#xff09;端口探测&#xff08;四&#xff09;服务识别&#xff08;五&#xff09;操作系统识别 三、其它 一、前言 当我们在构建环境或排查…

【电子通识】为什么单片机芯片上会有多组VDD电源?

在单片机芯片规格书中&#xff0c;我们经常能看到多个组VDD的设计&#xff0c;如下红框所示管脚都是VDD管脚。 为什么需要这样设计&#xff1f;只设置一个VDD管脚&#xff0c;把其他的VDD管脚让出来多做几个IO或是其他复用功能不好吗&#xff1f;接下来我们从单片机内部的电路结…

Linux线程(二)----- 线程控制

目录 前言 一、线程资源区 1.1 线程私有资源 1.2 线程共享资源 1.3 原生线程库 二、线程控制接口 2.1 线程创建 2.1.1 创建一批线程 2.2 线程等待 2.3 终止线程 2.4 线程实战 2.5 其他接口 2.5.1 关闭线程 2.5.2 获取线程ID 2.5.3 线程分离 三、深入理解线程 …

eureka 简介和基本使用

Eureka 是Netflix开发的服务发现框架&#xff0c;是Spring Cloud微服务架构中的一部分。它主要用于微服务架构中的服务注册与发现。Eureka由两部分组成&#xff1a;Eureka Server 和 Eureka Client。获取更详细的信息可以访问官网&#xff0c;如下图&#xff1a; Eureka Server…

Qt的QThread、QRunnable和QThreadPool的使用

1.相关描述 随机生产1000个数字&#xff0c;然后进行冒泡排序与快速排序。随机生成类继承QThread类、冒泡排序使用moveToThread方法添加到一个线程中、快速排序类继承QRunnable类&#xff0c;添加到线程池中进行排序。 2.相关界面 3.相关代码 widget.cpp #include "widget…

文献速递:深度学习--深度学习方法用于帕金森病的脑电图诊断

文献速递&#xff1a;深度学习–深度学习方法用于帕金森病的脑电图诊断 01 文献速递介绍 人类大脑在出生时含有最多的神经细胞&#xff0c;也称为神经元。这些神经细胞无法像我们身体的其他细胞那样自我修复。随着年龄的增长&#xff0c;神经元逐渐死亡&#xff0c;因此变得…

2024-02-23(Spark)

1.RDD的数据是过程数据 RDD之间进行相互迭代计算&#xff08;Transaction的转换&#xff09;&#xff0c;当执行开启后&#xff0c;代表老RDD的消失 RDD的数据是过程数据&#xff0c;只在处理的过程中存在&#xff0c;一旦处理完成&#xff0c;就不见了。 这个特性可以最大化…

【非递归版】归并排序算法(2)

目录 MergeSortNonR归并排序 非递归&归并排序VS快速排序 整体思想 图解分析​ 代码实现 时间复杂度 归并排序在硬盘上的应用&#xff08;外排序&#xff09; MergeSortNonR归并排序 前面的快速排序的非递归实现&#xff0c;我们借助栈实现。这里我们能否也借助栈去…

2.5G/5G/10G高速率网络变压器(网络隔离变压器)产品介绍(1)

Hqst华轩盛(石门盈盛)电子导读&#xff1a;高速率/2.5G 的带POE插件&#xff08;DIP&#xff09;款千兆双口网络变压器2G54801DP特点 一 ﹑2.5G高速率网络变压器&#xff08;网络隔离变压器&#xff09;&#xff1a;2G54801DP外观与尺寸 2G54801DP这颗产品尺寸为&#xff1a;长…