Vue面试之组件通信的方式总结(上篇)

Vue面试之组件通信的方式总结

  • props父子组件传参
    • props父组件向子组件传参
      • 数组形式
      • 对象的简单形式
      • 对象的复杂形式
    • props子组件向父组件传参
      • 通过传递方法的形式
      • 通过传递事件的形式
  • 插槽
    • 默认插槽
    • 具名插槽
    • 作用域插槽

    最近在整理一些前端面试中经常被问到的问题,分为vue相关、react相关、js相关、react相关等等专题,可持续关注后续内容,会不断进行整理~

    在Vue框架中,提供了多种组件通信方式:props父子组件传参、插槽传参、Event Bus方式、vuex方式传参等,本篇先对前两种方法进行总结~

props父子组件传参

props父组件向子组件传参

props算是vue中比较简单的语法,通过在标签中定义属性的方式实现父组件对子组件的信息传递,关于传参的限定有三种方式:
需要注意的是,props是单向数据流传递,因此对接收到的props只是使用,不能修改!

数组形式

该方式是最为简单的方式,只需在接收prop的组件中以数组的形式备案要使用的props参数名即可,如下示例:

export default {name: 'xxx',props: ['name', 'age', 'sex']
}

对象的简单形式

如果想要指定接收props参数的类型,可通过此种方式进行简单限定,如:

export default {name: 'xxx',props: {name: String,age: Number,sex: String}
}

对象的复杂形式

如果还要对参数进行进一步的限制,如是否必输、默认值等,可采用此种方式进行限定:

export default {name: 'xxx',props: {name: {type: String,required: false,default: '小红'},age: {type: Number,required: true,default: 12},sex: {type: String,required: false}}
}

如果传递prop时没有满足对应限制,则会在控制台上报错。

props子组件向父组件传参

props也可实现子组件向父组件传递数据,即利用父组件向子组件传递事件/方法的形式,通过这种方式,在子组件使用父组件传过来的方法时,就可利用参数传递的方式,将参数传递给父组件,真是妙~

通过传递方法的形式

/* parent组件 * /
<Son :something="doSomething"></Son> // 将doSomething方法进行传递
export default {name: "Parent",components: {Son,},methods: {doSomething(name) {console.log(name, '这就是由子组件传递过来的name值');},},
};
// Son组件
<template><button @click="do">点击触发方法</button>
</template>
<script>
import Son from './Son.vue';
export default {name: 'Son',props: ['something']
}
do() {this.something('小明') // 将子组件的参数传递给父组件
}
</script>

通过传递事件的形式

上述方法也可以通过$emit方法来调用父组件方法,从而将子组件参数传递给父组件,修改如下:

// 父组件
<template><Son @doSomething="something"></Son>
</template>
<script>
import Son from './Son.vue';export default {name: 'Parent',components: {Son}methods: {something(params) {console.log('拿到子组件传递过来的参数', params)}}}
</script>
// 子组件
<template><Button @click="do"></Button>
</template>
<script>export default {name: 'Son',methods: {do() {this.$emit('doSomething', '小红') // 触发父组件的doSomething事件,并将'小红'传递出去}}}
</script>

插槽

Vue提供了插槽机制,所谓插槽是指我现在这块地方要写一些内容,但是内容还不确定,因此我在此处用插槽占上位置,等后续在别处补充好了内容,就可以在此处展现出来效果。插槽用slot标签表示,有默认插槽具名插槽以及作用域插槽三种;而插槽的内容要写在组件标签之间,如

<A>此处即为插槽内容</A>

插槽的官方说法如下:

插槽作为组件的内容分发出口。它允许在父组件中,将任意子组件的内容“插入”到组件模板中的特定位置,以便在不同的场景下展示不同的内容。插槽提供了一种灵活的方式来组合父组件和子组件的内容,并允许创建更灵活、可复用的组件。

默认插槽

默认插槽是最简单的一种,形如:

<slot><slot>
<template><div>这是Parent组件</div><Son>插槽内容</Son>
</template>
<script>
import Son from './Son.vue';export default {name: 'Parent',components: {'B'}...}
</script>
<template><div>这是Son组件</div><slot></slot> // 插槽中的内容就会替换到这里
</template>
<script>export default {name: 'Son',...}
</script>

具名插槽

见名之意,就是为不同插槽起不同的名字,用于区分不同插槽;通过在slot标签中设置name属性即可;

<template><header><slot name="header"></slot></header><main><slot name="main"></slot></main><footer><slot name="footer"></slot></footer>
</template>

在向具名插槽提供内容时,可通过template标签设置slot指令指定其名称,如:

<template><div>这是Parent组件</div><Son><template slot="header">这是标题内容.....</template><template slot="main">这是主要内容.....</template><template slot="footer">这是底部内容.....</template></Son>
</template>
<script>export default {name: 'Parent',components: {'B'}...}
</script>

作用域插槽

如果想要将父组件访问子组件数据,此时可以使用作用域插槽方法,简单来说,就是在子组件slot标签上定义要传递的参数prop,这样在父组件中就可以通过slot-scope属性定义;

作用域插槽(或称为具名插槽的插槽内容作用域)允许子组件将数据传递给父组件,并且在父组件中可以直接访问和使用这些数据。

// Son组件
<template><div><div>son组件</div><slot :obj="obj"></slot> // 利用prop将obj数据传出去</div>
</template>
// Parent组件
<template><div><div>parent组件</div><template slot-scope="data">{{data.obj}} // 这里就可以拿到传递过来的数据obj,data可以随便定义</template></div>
</template>

以上示例皆是基于Vue2版本,在Vue3中,使用v-slot代替了slot-scope,在使用具名插槽和作用域插槽时要注意区分~

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

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

相关文章

go 语言常见问题(1)

1. 使用值为 nil 的 slice、map会发生啥 允许对值为 nil 的 slice 添加元素&#xff0c;但对值为 nil 的 map 添加元素&#xff0c;则会造成运行时 panic。 func main() {// slice 正确示例var s []ints append(s, 1)// map 错误示例var m map[string]intm["one"]…

ChatGPT3.5、GPT4.0、DALL·E 3和Midjourney对话与绘画智能体验

MidTool&#xff08;https://www.aimidtool.com/&#xff09;是一个集成了多种先进人工智能技术的助手&#xff0c;它融合了ChatGPT3.5、GPT4.0、DALLE 3和Midjourney等不同的智能服务&#xff0c;提供了一个多功能的体验。下面是这些技术的简要介绍&#xff1a; ChatGPT3.5&am…

办公场景日益多样化 企业如何保持安全?

当前&#xff0c;企业的办公场景日益多样化。远程办公、移动办公、云办公、分支机构等&#xff0c;这些新的办公场景也带来了新的网络安全挑战。以下将介绍一些办公场景带来的安全威胁。 1、远程办公&#xff1a;员工可以在任何地方工作&#xff0c;但同时也带来了网络安全的隐…

C++游戏引擎中的坐标系

一.Direct3D四大变换 <1.世界矩阵变换: 为了模拟3D物体的旋转,缩放,平移等功能,Direct3D将静态模型的顶点坐标x,y,z经过旋转平移矩阵变换以得到新的顶点坐标x1,y1,z1 D3DXMATRIX mTrans ; D3DXMatrixTranslation (&mTrans , 5 , - 3 , 0 ); g_pd3dDevice->SetTr…

Pytorch将标签转为One-Hot编码

一、标签映射与One-Hot编码过程 先进行标签映射&#xff0c;要为每个分类建立一个整数索引&#xff0c;对于每个样本的标签&#xff0c;使用整数索引创建一个长度为类别总数的二进制向量。这个向量的所有元素都是0&#xff0c;除了与整数索引相对应的位置&#xff0c;该位置的…

引领行业赛道!聚铭网络入选安全419年度策划“2023年教育行业优秀解决方案”

近日&#xff0c;由网络安全产业资讯媒体安全419主办的《年度策划》2023年度优秀解决方案评选结果正式出炉&#xff0c;聚铭网络「高校大日志留存分析及实名审计解决方案」从众多参选方案中脱颖而出&#xff0c;被评为“教育行业优秀解决方案”&#xff0c;以硬核实力引领行业赛…

java基础 -02java集合之 List,AbstractList,ArrayList介绍

补充上篇 AbstractCollection < E > 在正式List之前&#xff0c;我们先了解我们补充上篇Collection接口的拓展实现&#xff0c;也就是说当我我们需要实现一个不可修改的Collection的时候&#xff0c;我们只需要拓展某个类&#xff0c;也就是AbstractCollection这个类&a…

ChatGPT4+Python近红外光谱数据分析及机器学习与深度学习建模

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…

安全漏洞周报(2024.01.01-2023.01.08)

漏洞速览 ■ 用友CRM系统存在逻辑漏洞 漏洞详情 1. 用友CRM系统存在逻辑漏洞 漏洞介绍&#xff1a; 某友CRM系统是一款综合性的客户关系管理软件&#xff0c;旨在帮助企业建立和维护与客户之间的良好关系。它提供了全面的功能&#xff0c;包括销售管理、市场营销、客户服…

1.10 Unity中的数据存储 XML

一、XML 1.介绍 XML是一个文档后缀名是*.xmlXML是一个特殊格式的文档XML是可扩展的标记性语言XML是Extentsible Markup Language的缩 写XML是由万维网联盟(W3C)创建的标记语言&#xff0c;用于定义编码人类和机器可以读取的文档的语法。它通过使用定义文档结构的标签以及如何…

代码随想录算法训练营第二十一天| 回溯 216. 组合总和 III 17. 电话号码的字母组合

216. 组合总和 III 可以参考77.组合中关于选取数组的相关操作。 递归函数的返回值以及参数&#xff1a;一般为void类型 递归函数终止条件&#xff1a;path这个数组的大小如果达到k&#xff0c;说明我们找到了一个子集大小为k的组合了&#xff0c;然后当n为0的时候&#xff0…

uniApp下载图片到手机相册,适配Android、Ios、微信小程序、H5

uniapp下载图片到手机&#xff0c;适配Android、Ios、微信小程序、H5 1.根据不同设备展示不同的按钮1.1 图片显示1.2 微信小程序显示的按钮1.3 h5显示的按钮1.4 app显示的按钮 2. 引入需要用到的文件3. data中需要的数据4. onload方法5. methods需要用到的方法6. 获取手机相册的…

Maven报错:Malformed \uxxxx encoding 解决办法

maven构建出现这个Malformed \uxxxx encoding问题&#xff0c;应该是maven仓库里面有脏东西进入了&#xff01; 解决&#xff1a; 将仓库中的resolver-status.properties文件全部干掉。 我使用的everything工具全局搜索resolver-status.properties文件&#xff0c;然后Ctrla,再…

Nodejs 第三十一章(响应头和请求头)

响应头 HTTP响应头&#xff08;HTTP response headers&#xff09;是在HTTP响应中发送的元数据信息&#xff0c;用于描述响应的特性、内容和行为。它们以键值对的形式出现&#xff0c;每个键值对由一个标头字段&#xff08;header field&#xff09;和一个相应的值组成。 例如…

第三十九级台阶

解题思路&#xff1a; 本题运用递归的思想&#xff0c;每走一步可以上一个或者两个台阶&#xff0c;一开始是左脚最后是右脚&#xff0c;所以走的总步数应该为偶数&#xff0c;最后跨过的台阶数应该等于39。 解题代码&#xff1a; public class disnashijiujitaijie {static i…

03. BI - 详解机器学习神器 XGBoost

本文专辑 : 茶桁的AI秘籍 - BI篇 原文链接: https://mp.weixin.qq.com/s/kLEg_VcxAACy8dH35kK3zg 文章目录 集成学习XGBoost Hi&#xff0c;你好。我是茶桁。 学习总是一个循序渐进的过程&#xff0c;之前两节课的内容中&#xff0c;咱们去了解了LR和SVM在实际项目中是如何使…

ROS2学习笔记二:开发准备

目录 1 DDS介绍 2. 工程介绍 4 构建工具colcon 5 启动一个节点 1 DDS介绍 DDS&#xff0c;全称 Data Distribution Service (数据分发服务)。是由对象管理组 (OMG) 于 2003 年发布并于 2007 年修订的开分布式系统标准。通过类似于ROS中的话题发布和订阅形式来进行通信&…

100V耐压 LED恒流驱动芯片 SL2516D兼容替换LN2516车灯照明芯片

SL2516D LED恒流驱动芯片是一款专为LED照明设计的高效、高精度恒流驱动芯片。与LN2516车灯照明芯片兼容&#xff0c;可直接替换LN2516芯片&#xff0c;为LED车灯照明提供稳定、可靠的电源解决方案。 一、SL2516D LED恒流驱动芯片的特点 1. 高效率&#xff1a;SL2516D采用先进的…

HarmonyOS4.0系统性深入开发17进程模型概述

进程模型概述 HarmonyOS的进程模型&#xff1a; 应用中&#xff08;同一包名&#xff09;的所有UIAbility运行在同一个独立进程中。WebView拥有独立的渲染进程。 基于HarmonyOS的进程模型&#xff0c;系统提供了公共事件机制用于一对多的通信场景&#xff0c;公共事件发布者…

深度解析-Java语言的未来

深度解析-Java语言的未来&#xff0c;文末有我耗时一个月&#xff0c;问遍了身边的大佬&#xff0c;零基础自学Java的路线&#xff0c;适用程序员入门&进阶&#xff0c;Java学习路线&#xff0c;2024新版最新版。 文章目录 Q1 - 能否自我介绍下&#xff1f; Q2 - Java语…