Vue3内置组件Teleport用于什么场景,具体用法是怎样的
Admin 2022-06-29 群英技术资讯 777 次浏览
Vue 3.0
新增了一个内置组件 teleport
,主要是为了解决以下场景:
有时组件模板的一部分逻辑上属于该组件,而从技术角度来看,最好将模板的这一部分移动到 DOM
中 Vue app
之外的其他位置
场景举例:一个 Button
,点击后呼出模态对话框
这个模态对话框的业务逻辑位置肯定是属于这个 Button
,但是按照 DOM
结构来看,模态对话框的实际位置应该在整个应用的中间
这样就有了一个问题:组件的逻辑位置和DOM
位置不在一起
按照以前 Vue2
的做法,一般是使用 position: fixed
; 等CSS属性强行把对话框定位到了应用的中间位置,属于没有办法的办法,下面展示下 teleport
的基础用法。
用法非常简单,只需要使用 to 这个属性就可以把组件渲染到想要的位置
// 渲染到body标签下 <teleport to="body"> <div class="modal"> I'm a teleported modal! </div> </teleport>
也可以使用:
<teleport to="#some-id" /> <teleport to=".some-class" /> <teleport to="[data-teleport]" />
必须是有效的查询选择器或 HTMLElement
进一步
现在我们来封装一个标准的模态对话框
<template> <teleport to="body"> <transition name="dialog-fade"> <div class="dialog-wrapper" v-show="visible"> <div class="dialog"> <div class="dialog-header"> <slot name="title"> <span class="dialog-title"> {{ title }} </span> </slot> </div> <div class="dialog-body"> <slot></slot> </div> <div class="dialog-footer"> <slot name="footer"> <button @click="onClose">关闭</button> </slot> </div> </div> </div> </transition> </teleport> </template> <script> import { defineComponent } from 'vue'; export default defineComponent({ name: 'tdialog' }); </script> <script setup> const props = defineProps({ title: String, visible: Boolean }); const emit = defineEmits(['close']); const onClose = () => { emit('close'); }; </script>
使用的时候,只需要
<t-dialog title="LGD是不可战胜的" :visible="visible" @close="onClose"> 这是一段内容,萧瑟仙贝。 </t-dialog> // ... const visible = ref(false); const onDialog = () => { visible.value = !visible.value; }; const onClose = () => { visible.value = false; };
更进一步
上面我们已经把标准的模态对话框组件完成了,还有另外一种相似的,只需要展示少量文字的轻量级提示组件 Message
在上面的例子中,我们总是把 TDialog
组件写在使用的地方,但是这个 Messgae
组件,我们在想提示的时候使用一个js语句就把它呼出来,类似于下面的这样
// 呼出一个提示 Message({ message: '这是一条Message消息' });
想使用一个函数呼出来,我们需要准备下这个函数,这个函数的作用就是完成组件的渲染。
const Message = options => { // 准备渲染容器 const container = document.createElement('div'); // 生成vnode const vnode = createVNode(MessageConstructor, options); // 渲染 render(vnode, container); };
MessageConstructor
是什么?就是我们的SFC(单文件组件):
<template> <teleport to="#app"> <transition name="message-fade"> <div v-show="visible" ref="ins" class="message" :style="customStyle">{{ message }}</div> </transition> </teleport> </template>
总结:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
本文实例为大家分享了js实现列表自动滚动循环播放的具体代码,供大家参考,具体内容如下
我们了解到,Node采用了事件驱动机制,而EventEmitter就是Node实现事件驱动的基础,本文主要介绍了node.js自定义实现EventEmitter,感兴趣的可以了解一下
目录泛型简介举个????举个????????泛型参数的默认值——函数重载泛型参数的默认值——正文参考泛型简介软件工程中,我们不仅要创建一致的定义良好的 API,同时也要考虑可重用性。 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。在像C# 和 Java 这样的语言中,可以使用 泛
这篇文章主要介绍了JS解决 Array.fill()参数为对象指向同一个引用地址问题,解决方案使用map返回出不同的引用的地址,fill参数可随意填写(不为空),主要是map函数中返回的数据,需要的朋友可以参考下
这篇文章主要给大家介绍了关于VUE+Canvas实现简单五子棋游戏的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008