当前位置: 首页 > Web前端 > vue.js

Vue3.0传送门teleport

时间:2023-04-01 00:06:42 vue.js

先来看一段代码。功能非常简单。模板中有一个按钮。单击该按钮以显示模态窗口。constapp=Vue.createApp({data(){return{show:false,};},方法:{handleShowModal(){this.show=true;},},模板:`显示模态窗口模态窗口

`}模态窗口样式如下:.box{position:absolute;width:100px;height:100px;background-color:cadetblue;}.modal{position:absolute;top:0;bottom:0;left:0;right:0;background:rgba(0,0,0,0.5);}整个模态窗口绝对定位,left,right,top,bottom全部设置为0,背景色为黑色半透明。达到想要的效果效果,点击按钮,模态窗口覆盖了整个页面。现在运行一下,我们会发现模态窗口只覆盖了#box元素,因为#box本身是绝对定位的,模态窗口元素是它的child节点,所以modalwindow只有#box元素被覆盖了。在学习telepor之前t,我们会在根节点定义一个模态窗口,并在业务组件中调用它。但是这样的话,组件的逻辑和模态窗口会有分离感。有什么办法可以让我在这个组件中写模态窗口,但是当它真正呈现在页面上时,可以动态插入到元素中?其实是有的,我们只需要简单的修改模板template,这个需求就可以完成。template:`显示模态窗口模态窗口
`我们使用teleport元素包裹modal,并定义属性为="body",运行页面,我们查看dom节点,会发现modal元素已经添加到body底部,效果如下。--body--#rootvue根节点--.modal模态窗口发送到其他位置如果我们想将模态节点发送到其他位置,我们可以这样做。modalwindow这段代码是给id=app的元素添加modal元素,有一点需要注意,我一直在谈论添加元素。如果#app中还有其他节点,那么模态元素将被添加到这些节点中。如果你有兴趣,你可以自己尝试一下。与组件一起使用其实,使用组件和普通的dom元素没有区别。组件中的节点会被渲染到指定的dom节点(body或指定的ID)constapp=Vue.createApp({...template:`显示模态窗口`}app.component('child-component',{props:['name']template:`{{name}}}`})即使渲染到不同的节点,它仍然接收由父组件和普通子组件一样,并没有因为渲染节点的变化而变化。对同一个目标使用多个传送
A
B
结果如下:--#modal--A--B所以上面我已经强调了teleport的使用是将package元素追加到指定节点,所以上面两个teleport会依次追加到#modal,综上,teleport主要用在logic并且属于这个组件,但是从技术角度来说,它必须被移动到other节点中(body或具有指定ID的元素)。最常见的场景是创建一个包含全屏模式的组件。逻辑存在于组件中,但基于css样式,需要移至body元素中。