vue.js - Vue 3 Teleport 是否仅适用于移植到 Vue 外部?
问题描述
Vue 3 有一个新的 Teleport 功能,它取代了 vue 2 中的 portal-vue 插件。但是,我发现不可能将组件移植到由 vue 控制的地方(=在 vue 应用程序中)。它仅在移植到外部(身体,其他元素......)时才有效。
const app = {
template: `
<div>
<h1>App</h1>
<div id="dest"></div>
<comp />
</div>`
}
Vue.createApp(app).component('comp', {
template: `
<div>
A component
<Teleport to="#dest">
Hello From Portal
</Teleport>
</div>`
}).mount('#app')
<script src="https://unpkg.com/vue@3.0.0-rc.9/dist/vue.global.js"></script>
<div id="app"></div>
如您所见,控制台甚至报告说需要已经渲染传送目标。但是如何告诉 vue 先渲染哪个组件呢?在我的示例中,目标位于传送之前的 dom 中。
这在portal-vue 中不是问题,而且非常令人沮丧,因为它使整个概念变得不那么可用。
解决方案
Vue 错误消息类型指出了问题。它说Invalid Teleport target on mount: null
问题是目标尚不存在。
这可以通过仅在安装组件后仅渲染传送部分来轻松解决。
看起来这是 Vue 应该在没有明确检查的情况下处理的事情。当您将 id 作为字符串传递时,很难判断目标是否是 Vue 组件,尤其是在尚未渲染的情况下。但我只是在这里猜测团队的意图。
const app = {
template: `
<div>
<h1>App</h1>
<div id="dest"></div>
<comp />
</div>`
}
Vue.createApp(app).component('comp', {
template: `
<div>
A component
<Teleport to="#dest" v-if="isMounted">
Hello From Portal
</Teleport>
</div>`,
data: function(){
return {
isMounted: false
}
},
mounted(){
this.isMounted = true
}
}).mount('#app')
<script src="https://unpkg.com/vue@3.0.0-rc.9/dist/vue.global.js"></script>
<div id="app"></div>
推荐阅读
- xcode - 如果我继续使用旧的 Xcode 版本会怎样?
- java - 如何使用 Spring Boot 将 Multipart 文件映射到 DTO 以获取传入请求
- linux - 如何在 Linux 上使用 curl 将元数据上传到 gcloud 存储?
- r - 仅在当日时间段内运行分析 - 动物园
- azure - 将 blob 从一个存储帐户复制到另一个而不覆盖现有文件
- c++ - 如何读取为字符串,然后将其设为 int 向量;
- html - 有没有办法在 css 中创建动态实用程序类?
- python - 在 python/pyspark 中使用累积和赋值
- excel - VBA根据活动工作表激活用户表单选项卡
- java - WebClient 请求中的 timeout() 和 HttpClient 中的超时之间的区别