这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战
这篇文章我们来讲一下最后一个内置组件teleport
的使用方法,在使用它们的时候我们又该注意什么呢,下面让我们一探究竟把。
为什么使用 teleport
我们在Vue中可以通过将 UI
和相关行为
封装到组件中来构建 UI
。我们也可以层级嵌套,说白了就是元素或组件可以一层套一层,形成一个UI树
。
然而,有时组件模板的一部分逻辑上属于该组件,而从技术角度来看,最好将模板的这一部分移动到 DOM 中 Vue app 之外的其他位置。例如:
创建一个包含全屏模式的组件。在大多数情况下,你希望模态框的逻辑存在于组件中,但是模态框的快速定位就很难通过 CSS 来解决,或者需要更改组件组合。这个时候我们就可以用teleport
来解决这个问题。
如何使用
teleport
有两个Prop:to
和 disabled
。
-
to
-string
。需要 prop,必须是有效的查询选择器或 HTMLElement (如果在浏览器环境中使用)。使用to
九可以把teleport
包裹的内容传送到指定元素
内。 -
disabled
-boolean
。此可选属性可用于禁用<teleport>
的功能,这意味着teleport
包裹的内容会在当前的位置,不会发生改变。
to
使用to
传送到指定元素内,如下:
渲染前
<div id="app">
<h1>
<teleport to="#app">
<span>{{title}}</span>
</teleport>
</h1>
</div>
渲染后
<div id="app" data-v-app="">
<span>Hi, world!</span>
<h1><!--teleport start--><!--teleport end--></h1>
</div>
通过上述代码,你是不是发现 span
跑到了div#app
下面了,这就是teleport
的作用。
disabled
使用to
可以让teleport
禁止传送,就好像施了定身术一样,如下:
渲染前
<div id="app">
<h1>
// 此处多了 disabled
<teleport to="#app" :disabled="true">
<span>{{title}}</span>
</teleport>
</h1>
</div>
渲染后
<div id="app" data-v-app="">
<h1>
<!--teleport start-->
<span>Hi, world!</span>
<!--teleport end-->
</h1>
</div>
让:disabled="true"
就可以禁止teleport
的功能了。
结合 components 使用
我们可以把teleport
用到components
中,自定义两个组件,如下:
my-component-child
app.component('my-component-child', {
props:['name'],
template: `<span>{{name}}</span>`
})
my-component
app.component('my-component', {
template: `<h1>
<span>hello</span>
<teleport to="#app">
<my-component-child name="world"></my-component-child>
</teleport>
</h1>`
})
这里我们需要注意的是:即使在不同的地方渲染 my-component-child
,它仍将是 my-component
的子级,并将从中接收 name
prop。
在同一目标上使用多个 teleport
有时我们会有这样的需求:需要多个 <teleport>
组件将其内容挂载到同一个目标元素上。顺序将是一个简单的追加——稍后挂载将位于目标元素中较早的挂载之后。如下:
渲染前
<div id="app">
<h3>
<teleport to="#app">
<h1>hello</h1>
</teleport>
<teleport to="#app">
<h1>world</h1>
</teleport>
</h3>
</div>
渲染后
<div id="app" data-v-app="">
<h1>hello</h1>
<h1>world</h1>
<h3>
<!--teleport start--><!--teleport end-->
<!--teleport start--><!--teleport end-->
</h3>
</div>
总结
teleport
在实际开发中是非常使用的,我们可以更方面的处理一些需求。
比如我需要一个全屏功能但是,要在它的父级或者其他级显示,我们就可以用teleport
。如果不用它,我们需要写很多复杂的逻辑来实现这个功能。
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!