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://xiahunao.cn/news/2815421.html

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

相关文章

爱旅行平台的设计与实现

爱旅行平台的设计与实现 获取源码——》公主号&#xff1a;计算机专业毕设大全

Oracle中序列

1. Sequence 定义 在Oracle中可以用SEQUENCE生成自增字段。Sequence序列是Oracle中用于生成数字序列的对象&#xff0c;可以创建一个唯一的数字作为主键。 2. 为什么要用 Sequence 你可能有疑问为什么要使用序列&#xff1f; 不能使用一个存储主键的表并每次递增吗&#xf…

java 反射机制 (一)

java反射机制&#xff1a; 即通过外部文件配置&#xff0c;不修改文件源码的情况下&#xff0c;来控制程序&#xff0c;也符合设计模式的OCP原则&#xff08;开闭原则&#xff1a;不修改源码&#xff0c;扩容原则&#xff09; Java Reflection 1.反射机制允许程序在执行期间…

Spring中的事务和事务的传播机制

事务是一组操作的集合&#xff0c;不可以被分割。事务会把所有的操作作为一个整体&#xff0c;这组操作要么全部成功&#xff0c;要么全部失败。 事务有三种操作&#xff1a; 开启事务&#xff1b;提交事务&#xff1b;回滚事务。 如果代码的执行逻辑是这样&#xff1a; 开…

dolphinscheduler海豚调度(三)SQL任务

在之前的博文中&#xff0c;我们已经介绍了DolphinScheduler海豚调度的基本概念和模块&#xff0c;安装部署和元数据切换&#xff0c;以及Shell任务的实践。今天&#xff0c;让我们来深入探讨DolphinScheduler中另一种常见的任务类型&#xff1a;SQL任务。 SQL任务是DolphinSc…

弹窗内容由后端返回,如何让点击按钮的事件交由前端控制?

一、场景 背景&#xff1a;因为系统里经常有新活动或者公告需要通知所有用户&#xff0c;希望前端维护的这个弹窗里的内容可以由后端接口返回。这样就不需要每次上新活动的时候&#xff0c;前端项目都发版了。因此&#xff0c;前端维护了这个弹窗和它的关闭事件&#xff0c;至…

人工智能之Tensorflow常用API

TensorFlow的计算表现为数据流图&#xff0c;所以tf.Graph类中包含一系列表示计算的操作对象(tf.Operation)&#xff0c;以及在操作之间流动的数据–张量对象(tf.Tensor)。 Graph tf.Graph类包含图相关的API操作&#xff0c;可以在jupyter notebook导入tensorflow之后执行hel…

前端Vue项目无法启动服务,提示无 ‘dev‘ npm的脚本问题解决

目录 一、问题详情 二、问题解决 一、问题详情 上周还能运行的项目&#xff0c;今天突然无法执行了&#xff0c;连最基本的启动按钮也没有了&#xff0c;所有的项目本地都突然跑不起来了&#xff0c;附上截图。 二、问题解决 后来排查的根本原因有点奇葩&#xff0c;是因为…

【踏雪无痕的痕四】——0到底是有还是没有?

目录 一、背景介绍三、过程1.0的历史发展&#xff1f;2.如何将0讲给一个刚上一年级的孩子&#xff1f;3.0的边界和意义&#xff1f;4.那四年&#xff0c;到底在培养什么&#xff1f;和0有什么关系&#xff1f; 四、总结 一、背景介绍 最近在看一年级数学&#xff0c;其中介绍到…

javaWeb个人学习02

会话技术 会话: 用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束.在一次会话中包含多次请求和响应 会话跟踪: 一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一个浏览器,以便在同一次会话的多次请求之间共享数据 会话跟踪方案: …

艺术作品展示图片介绍PR相册视频模板

高级感艺术风格摄影、绘画作品展示文字介绍PR图片相册照片视频模板mogrt下载。 Premiere Pro 2023及以上版本&#xff0c;不需要插件&#xff0c;高清&#xff08;19201080&#xff09;分辨率/30fps&#xff0c;易于定制&#xff0c;持续时间01:00秒&#xff0c;包含PDF帮助文件…

猜猜心里数字(个人学习笔记黑马学习)

1.定义一个变量&#xff0c;数字类型&#xff0c;内容随意 2.基于input语句输入猜想的数字&#xff0c;通过if和多次elif的组合&#xff0c;判断猜想数字是否和心里数字一致 num5if int(input("请输入第一次猜想的数字&#xff1a;"))5:print("猜对了&#xff0…

三分钟一起了解工作流拖拽

低代码技术平台是如今深受很多行业喜爱的得力助手&#xff0c;也是实现提质增效的办公效果的有力武器。作为一家专业研发低代码技术平台的服务商&#xff0c;流辰信息的IBPS在很多行业领域中得到了大家的认可和喜爱&#xff0c;其中&#xff0c;工作流拖拽功能也是IBPS的主要功…

基于Springboot的计算机知识竞赛网站(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的计算机知识竞赛网站&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

【严格递增】2972统计移除递增子数组的数目 II

作者推荐 动态规划的时间复杂度优化 本文涉及知识点 严格递增 子数组 LeetCode2972. 统计移除递增子数组的数目 II 给你一个下标从 0 开始的 正 整数数组 nums 。 如果 nums 的一个子数组满足&#xff1a;移除这个子数组后剩余元素 严格递增 &#xff0c;那么我们称这个子…

【王道数据结构】【chapter7查找】【P309t10】

边那些一个递归算法&#xff0c;在一棵有n个几点的、随机建立起来的二叉排序树上查找第k(1<k<n)小的元素并返回指向该节点的指针。要求算法的平均时间复杂度为O(log2n).二叉排序树的每个结点中除data,lchild,rchild等数据成员外&#xff0c;增加一个count成员&#xff0c…

贪心算法

贪心算法 例题1、股票买卖题目信息思路题解 2、货仓选址题目信息思路题解 3、糖果传递题目信息思路题解 4、雷达设备题目信息思路题解 例题 1、股票买卖 题目信息 思路 相邻两天&#xff0c;后>前&#xff0c;则交易一次 题解 #include <bits/stdc.h> #define en…

Ansible script 模块 该模块用于将本机的脚本在被管理端的机器上运行。Ansible服务执行本机脚本

目录 过程首先&#xff0c;我们写一个脚本&#xff0c;并给其加上执行权限直接运行命令来实现在被管理端执行该脚本验证错误演示 过程 该模块直接指定脚本的路径即可 首先&#xff0c;我们写一个脚本&#xff0c;并给其加上执行权限 vim /tmp/df.sh编辑脚本内容 这个脚本内容…

动态住宅IP vs 静态住宅IP,如何选择适合你的海外住宅IP?

随着数字时代的发展&#xff0c;网络已经成为了我们日常生活中不可或缺的一部分。在海外留学、旅游、工作或者进行电子商务等活动时&#xff0c;一个合适的住宅IP可以帮助我们保护个人隐私、确保网络连接的稳定性、提高在线服务的可靠性等。因此&#xff0c;选择适合自己的住宅…

【C++】树形关联式容器set、multiset、map和multimap的介绍与使用

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.关联式容器 2.键…