Vue3内置组件Teleport用于什么场景,具体用法是怎样的
Admin 2022-06-29 群英技术资讯 905 次浏览
这篇文章主要介绍“Vue3内置组件Teleport用于什么场景,具体用法是怎样的”,有一些人在Vue3内置组件Teleport用于什么场景,具体用法是怎样的的问题上存在疑惑,接下来小编就给大家来介绍一下相关的内容,希望对大家解答有帮助,有这个方面学习需要的朋友就继续往下看吧。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进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
vue中nexttick原理是什么?如果有使用过vue的朋友应该知道,vue里面的nextTick可以获取到更新后的DOM,但一些朋友并不清楚nextTick里面究竟做了什么,因此本文我们就来了解一下vue中nexttick原理。
状况:本地的前端项目(uni-app)以及后台管理(vue-mongo-node)和本地mongo数据库前台项目端口是8082,后台数据接口是8081.跨域解决,直接上代码:uni-app的mainfest.json下: 红色部分代理(node设置允许跨域之后,不加这部分的代理也可以跨域请求) 可加可不加"app-plus":{/*5+App特有相关*/"splashsc
这篇文章主要介绍了vue+elementUI下拉框回显问题及解决方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
这篇文章给大家分享的是jQuery实现select不可编辑但可传值的方法。小编觉得挺实用的,因此分享给大家做个参考,文中的示例代码介绍得很详细,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。
代码分片是webpck打包工具所特有的一项技术,通过这项功能可以把代码按照特定的形式进行拆分,使用户不必一次全部加载,而是按需加载。本文就来详细介绍,感兴趣的可以了解一下
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008