Vue 的 teleport(传送 / 传送门)组件

类似于 componentkeep-alive, teleport 同样是Vue 的内建组件。

现在有一个自定义组件 error-alert, 是对 JavaScript 的 alert() 的改进,当输入不合法时,会弹出警告,代码如下所示,看起来是没有任何问题。

<template>
<div>
    <h2>Manage Goals</h2>
    <input type="text" ref="goal" />
    <button @click="setGoal">Set Goal</button>
    <error-alert v-if="inputIsInvalid">
        <h2>Input is invalid!</h2>
        <p> Please enter a few characters... </p>
        <button @click="confirmError">Okay</button>
    </error-alert>
</div>
</template>

<script>
import ErrorAlert from "./ErrorAlert.vue";
export default {
    components: {
        ErrorAlert,
    },
    data() {
        return {
            inputIsInvalid: false,
        }
    },
    methods: {
        setGoal() {
            const enteredValue = this.$refs.goal.value;
            if (enteredValue==='') {
                this.inputIsInvalid = true;
            }
        },
        confirmError() {
            this.inputIsInvalid =false;
        }
    }
}
</script>

但是如果查看HTML code,会发现 error-alert 的内容<dialog> 紧邻其他元素 <h2><input><button>,不过code里就是按这个顺序写的,虽然不影响功能,但从HTML语义的角度看显得很奇怪,因为这种 alert 应该是覆盖整个页面的,而不是嵌套到HTML code的某个地方。

在这里插入图片描述

为了解决这个问题,使用 Vue 内建组件 teleport,将自定义组件 error-alert 放到此组件内,并设置 to 属性,指向某个CSS 选择器,比方说 body:

<template>
<div>
    <h2>Manage Goals</h2>
    <input type="text" ref="goal" />
    <button @click="setGoal">Set Goal</button>
    <teleport to="body">
        <error-alert v-if="inputIsInvalid">
            <h2>Input is invalid!</h2>
            <p> Please enter a few characters... </p>
            <button @click="confirmError">Okay</button>
        </error-alert>
    </teleport>
</div>
</template>

逻辑上而言,<error-alert> 仍然属于这个容器组件, 仍然可以与这个组件内的方法交互等等,但是它会被渲染到dom结构的别的地方,在这个例子中,是在body元素内,可以通过页面源代码查看。

在这里插入图片描述
这是一个小小的优化,使 HTML 结构更加合理。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值