记录-VueJs中如何使用Teleport组件|全球即时

2023-04-07 18:32:38 | 来源:博客园

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

DOM结构相对比较复杂,层级嵌套比较深的组件内,需要根据相对应的模块业务处理一些逻辑,该逻辑属于当前组件

但是从整个页面应用的视图上看,它在DOM中应该被渲染在整个vue应用外部的其他地方,不能影响组件的结构


(相关资料图)

比较常见的应用场景:就是全屏的模态框,控制元素的位置,也是可以处理的,但是比较麻烦

在理想情况下,我们希望在具体的组件中,给元素绑定的事件,与具体要控制的DOM元素结构在同一个组件中,具体的位置处,保持一定的相关联性

而不用特意的把一些DOM结构给分离出去,然而,在同一组件中,触发模态框的按钮和模态框本身在同一组件中

因为他们都与组件的开关状态有相关联,模态框与按钮一起渲染在应用DOM结构很深的地方,会导致模态框的css布局位置非常难控制

鉴于这样的场景和困难,Vue官方提供了一个Teleport组件,很好的可以解决这个问题,让开发者不需要顾虑DOM结构的问题

01-组件套组件层次结构很深时

比如:现在有两个组件,父组件,子组件,在后代组件内,添加一个按钮,弹出一个模态框,让它在页面垂直水平居中显示

如下所示,父组件如下所示App.vue

<script setup>    import Child from "./Child.vue"</script>

如下是Child组件,示例代码如下所示Child.vue,我们需要在孙(后代)组件,添加一个按钮,点击按钮,弹出一个弹框,水平垂直居中显示在页面中央

<script setup>import { ref } from "vue";let isModel = ref(false);</script>

上面的子组件中有一个button按钮来触发打开当前组件的模态框,里面存在着控制弹框的显示和隐藏的逻辑,当嵌套的组件比较深,复杂时

如果父级元素存在定位,那在控制子元素的位置时,用csstransform或者position:absolute,参照对象的变更,会破坏布局结构,会出现一些css样式

控制的问题,解决起来会非常的痛苦

那这个Teleport组件就是为了解决这类问题,可以将指定的DOM结构片段,独立于到组件外面去,不受当前组件布局结构的影响

经过Teleport的修改后

<script setup>import { ref } from "vue";let isModel = ref(false);</script>

接收一个to prop来指定传送的目标。to的值可以是一个CSS选择器字符串,或id,也可以是一个DOM元素对象。这段代码的作用就是告诉Vue把以下模板片段传送到body标签下

html结构代码html结构代码html结构代码html结构代码

02-Teleport组件

它是Vue官方提供的一个内置组件,它可以将一个组件内部的一部分模板“传送”到该组件的DOM结构外层的位置去 也就是一种能够将我们的组件html结构移动到指定位置的技术

   里面是Html结构模板内容

注意

挂载时,传送的to目标必须已经存在于DOM中。理想情况下,这应该是整个Vue应用DOM树外部的一个元素。如果目标元素也是由Vue渲染的,你需要确保在挂载之前先挂载该元素

这个teleport将指定的模板html,放置到页面当中指定的位置处,它是有条件的,不是可以任意传送的

在安装组件之前,目标元素必须存在,即,目标不能由组件本身呈现,理想情况下应该位于整个Vue组件树之外。

如下代码是不行的

<script setup></script> 

03-需要知道的

teleport只是改变了渲染的DOM结构,它不会影响组件间的逻辑关系。也就是说,如果包含了一个组件,那么该组件始终和这个使用了的组件保持逻辑上的父子关系。传入的props和触发的事件也会照常工作。

这也意味着来自父组件的注入也会按预期工作,子组件将在Vue Devtools中嵌套在父级组件下面,而不是放在实际内容移动到的地方

位置移动了,提现在结构模板上,但是数据逻辑依旧存在关联的

04-如何禁用 Teleport

在某些场景下可能需要视情况禁用。举例来说,我们想要在桌面端将一个组件当做浮层来渲染,但在移动端则当作行内组件。我们可以通过对动态地传入一个disabled prop来处理这两种不同情况

  ...

05-多个Teleport共享目标时

一个可重用的模态框组件可能同时存在多个实例。对于此类场景,多个组件可以将其内容挂载在同一个目标元素上,而顺序就是简单的顺次追加,后挂载的将排在目标元素下更后面的位置上

比如下面这样的用例

  
A
B

渲染的结果为

A
B

总结

这个teleport组件在实际开发中还是很实用的,能够解决当组件嵌套层级很深,而后代组件中的模板,想要脱离当前组件结构,解决css布局层面的干扰,那就可以用这个teleport组件

本文转载于:

https://juejin.cn/post/7217731723509547069

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

上一篇 下一篇

相关新闻

记录-VueJs中如何使用Teleport组件|全球即时

世界时讯:太原小店区人才公寓在哪里?

CBST展会首日亮点-天天快资讯

全球速递!时隔六年阿根廷男足重回世界排名第一

周口市农商银行(农信社)召开跟岗学习干部汇报会 天天速看料

世界热讯:报告:一季度7成城市新房成交同比正增长

2019春节礼品酒古井 精彩看点

空地规划、道路通车……昌平网友关心的这些问题,官方回复了!

涉嫌严重违纪违法,他主动向组织交代问题

环球实时:小学入学不容错过!河北私立小学2023最新学费汇总

内蒙古准格尔旗:一季度煤炭销售量同比上升

环球消息!首个爆雷房企退市!新力控股挥别港交所

景尚宫韩式料理_对于景尚宫韩式料理简单介绍 每日快讯

豆浆是痛风手下“猛将”?医生:若想避免痛风,这3物尽量少吃

颈部淋巴结肿瘤早期症状_淋巴结肿瘤早期症状 热消息

最新新闻

记录-VueJs中如何使用Teleport组件|全球即时

世界时讯:太原小店区人才公寓在哪里?

CBST展会首日亮点-天天快资讯

全球速递!时隔六年阿根廷男足重回世界排名第一

周口市农商银行(农信社)召开跟岗学习干部汇报会 天天速看料

世界热讯:报告:一季度7成城市新房成交同比正增长

2019春节礼品酒古井 精彩看点

空地规划、道路通车……昌平网友关心的这些问题,官方回复了!

涉嫌严重违纪违法,他主动向组织交代问题

环球实时:小学入学不容错过!河北私立小学2023最新学费汇总

内蒙古准格尔旗:一季度煤炭销售量同比上升

环球消息!首个爆雷房企退市!新力控股挥别港交所

景尚宫韩式料理_对于景尚宫韩式料理简单介绍 每日快讯

豆浆是痛风手下“猛将”?医生:若想避免痛风,这3物尽量少吃

颈部淋巴结肿瘤早期症状_淋巴结肿瘤早期症状 热消息

月经来了能吃榴莲吗?

环球观热点:销量暴跌、口碑崩盘,广汽本田的危机何时解?

国际原油期货结算价下跌,本周累跌超1%

世界今日讯!平复“乱跳”的心!贵阳这家医院这项技术紧跟国内前沿

总算没白等!帕萨特见了惴惴不安,不足21万大众根本睡不着觉|全球最资讯

中光防雷拟1元转让凡维泰科技股权 标的三年亏 5323万资不抵债创始人接盘|全球快看点

中国园林博物馆举办“春日修禊记”2023年清明节文化活动

二十年,新起点:Blum 百隆中国工厂正式投入运营

世界信息:长江生态持续向好 “水中大熊猫”江豚现身宜昌江段

苏群:詹眉尽力了 湖人展现了他们不想放弃任何一场比赛的决心|新资讯

股海泛舟:科创走强,创业板反弹! 当前关注

跨越8国、500城,超级App Grab怎么“黏住”近万名人才?|GGV投资笔记第145期|全球最新

【环球时快讯】2024年投入使用!控江医院医技综合楼新建项目又有新进展→

豪鹏科技:建信养老金管理有限责任公司、中金基金管理有限公司等多家机构于4月4日调研我司 世界视讯

三星触屏手机型号大全_三星触屏手机