之前介绍了一波混入 mixin 和 自定义指令 directive 其基本作用就是为了在 vue 中实现代码的复用. 而本篇介绍的是 vue3 的一个新特性叫做传送门.

一听这个名字是不是就感觉特别科幻呢? 小时候看哆啦A梦的就经常使用传送门, 只要心里想着那个地方, 就能直接穿越过去. 然后就是在漫威宇宙中奇异博士的传送门啦, 想去哪就画个圈圈传送过去哦.

在 vue 中就表现为对一个 dom 进行有目的的直接传送啦, 这里我们以一个局部的蒙层来做演示:

<!DOCTYPE html>
<html lang="en"> <head>
<title>蒙层</title>
<script src="https://unpkg.com/vue@3"></script>
<style>
.box {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%); width: 200px;
height: 300px;
background: skyblue;
} .mask {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: rgba(0, 0, 0, .25);
}
</style>
</head>
<body>
<div id="root"></div>
<script>
const app = Vue.createApp({
data () {
return {
show: false
}
},
methods: {
handleClick () {
this.show = !this.show
}
},
template: `
<div class="box">
<button @click="handleClick">点我变蒙层</button>
<div class="mask" v-show="show"></div>
</div>
`
}) const vm = app.mount('#root') </script>
</body> </html>

可以发现在这个200 x 300px 的浅蓝色 box 中, 当我们点击 "点我变蒙层" 的按钮时, 只会作用于这个内部盒子而不会作用整个页面, 因为咱这个 mask 就是写在 box 中的嘛.

template: `
<div class="box">
<button @click="handleClick">点我变蒙层</button>
<div class="mask" v-show="show"></div>
</div>
`

而要实现整个页面的效果, 则咱需要将这个 mask 作用到 body 中去, 或者说将其直接"传送"到 body 下面哦.

传送门演示

来了老铁, 直接将这个 mask 传递到 body 哦, 即通过 teleport 这个标签来安排.

<!DOCTYPE html>
<html lang="en"> <head>
<title>传送门 teleport </title>
<script src="https://unpkg.com/vue@3"></script>
<style>
.box {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%); width: 200px;
height: 300px;
background: skyblue;
/* 让按钮的优先级增加以至于蒙层后不被覆盖掉 */
z-index: 2;
} .mask {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: rgba(0, 0, 0, .25);
}
</style>
</head>
<body>
<div id="root"></div>
<script>
const app = Vue.createApp({
data () {
return {
show: false
}
},
methods: {
handleClick () {
this.show = !this.show
}
},
template: `
<div class="box">
<button @click="handleClick">点我变蒙层</button>
<teleport to="body">
<div class="mask" v-show="show"></div>
</teleport>
</div>
`
}) const vm = app.mount('#root') </script>
</body> </html>

其核心就是这里的 teleplort 标签的包裹和 to 这个传送到哪啦.

template: `
<div class="box">
<button @click="handleClick">点我变蒙层</button>
<teleport to="body">
<div class="mask" v-show="show"></div>
</teleport>
</div>
`

当然也可以传送到比如模板中有一个 ID 为 youge 的标签中:

<teleport to="#youge">
<div class="mask" v-show="show"></div>
</teleport>

当然除了传蒙层, 对于其他的一些场景如 tab 块呀, 组件呀, dom 内容呀, 都是可以通过 teleport 进行传送的, 与我而言, 其好奇的科幻程度远大于应用程度啦. 那关于传送门的基本认知就先到这里啦.

小结

  • 传送门就是将某个 dom 或组件等能够传递到该模板的任意位置中, 类似奇异博士的传送门
  • 实现上就在 dom / 组件 外包裹一层 teleport 标签, to="选送的位置, 选择器" 即可
  • 好奇和科幻的程度远大于对它的实际应用程度啦

vue3 基础-传送门 teleport的更多相关文章

  1. vue3基础

    什么是CDN? 内容分发网络--通过相互链接的网络系统,利用最靠近用户的服务器,更快更可靠的发送给用户. vue的cdn引入 method中的函数为什么不能用this? this的主要使用是来获取da ...

  2. vue3 高阶 API 大汇总,强到离谱

    高阶函数是什么呢? 高阶函数英文名叫:Higher Order function ,一个函数可以接收一个或多个函数作为输入,或者输出一个函数,至少满足上述条件之一的函数,叫做高阶函数. 前言 本篇内容 ...

  3. Vue3 中有哪些值得深究的知识点?

    众所周知,前端技术一直更新很快,这不 vue3 也问世这么久了,今天就来给大家分享下vue3中值得注意的知识点.喜欢的话建议收藏,点个关注! 1.createApp vue2 和 vue3 在创建实例 ...

  4. JELLY技术周刊 Vol.23: Vue3 是伟大航路上的 One Piece 么?

    蒲公英 · JELLY技术周刊 Vol.23 这两天大家应该都被 Vue 发布 3.0 版本的信息刷屏了,背负着很多人的期待, Vue 终于将这个船新版本推到台前,接受大众的检验,那么这个代号为 On ...

  5. 简单对比vue2.x与vue3.x响应式及新功能

    简单对比vue2.x与vue3.x响应式 对响应方式来讲:Vue3.x 将使用Proxy ,取代Vue2.x 版本的 Object.defineProperty. 为何要将Object.defineP ...

  6. vue3知识点的自我总结

    1. 我们对ref的错误理解 ref 经常去监听基本数据类型. 同时也可以去监听[数组][对象]都是可以的. ref是深度的监听.并不是大家说的那样不能去监听复杂的数据类型. 只是根据我们推荐ref去 ...

  7. Vue3.0聊天室|vue3+vant3仿微信聊天实例|vue3.x仿微信app界面

    一.项目简介 基于Vue3.0+Vant3.x+Vuex4.x+Vue-router4+V3Popup等技术开发实现的仿微信手机App聊天实例项目Vue3-Chatroom.实现了发送图文表情消息/g ...

  8. 【废弃中】【WIP】JavaScript 数组

    创建: 2018/01/22 更新: 2018/05/20 把此博文加入[javascript]分类, 原来忘记了 废弃: 2019/02/19 重构此篇.原文归入废弃  增加[废弃中]标签与总体任务 ...

  9. Vue+Antd搭配百度地图实现搜索定位等功能

    前言 最近,在做vue项目的时候有做到选择地址功能,而原项目中又引入了百度地图,所以我就打算通过使用百度地图来实现地址搜索功能啦. 本次教程可能过于啰嗦,所以这里先放上预览地址供大家预览--点我预览, ...

  10. 极速上手 VUE 3 —— teleport传送门组件

    一.teleport 介绍 teleport 传送门组件,提供一种简洁的方式,可以指定它里面的内容的父元素.通俗易懂地讲,就是 teleport 中的内容允许我们控制在任意的DOM中,使用简单. 使用 ...

随机推荐

  1. 【软件开发】vcpkg学习笔记

    [软件开发]vcpkg 学习笔记 "vcpkg"是一个免费开源的 C++包管理器,可以以此很方便的处理第三方库的接入,且可嵌入进 CMake 中. 入门 入门教程请参照: http ...

  2. 探秘Transformer系列之(6)--- token

    探秘Transformer系列之(6)--- token 0x00 概述 语言是人类特有的概念.作为一个抽象符号,人是可以理解每个语言单词的意义的,但是现在的NLP语言模型无法直接的从感知中抽象出每个 ...

  3. Typecho网站内容的禁止复制和粘贴

    本教程讲JS实现网站内容的禁止复制和粘贴.另存为 1.使右键和复制失效 方法1: 在网页中加入以下代码: <script language="Javascript"> ...

  4. ARC101E题解

    前言 此片题解大致按照笔者做题思路进行讲解. 简要题意 有一棵树,树上有偶数个节点.你需要给这些点两两配对,一组已经配对的点会将两点之间的树边进行一次覆盖.一组合法方案需要满足树上所有边都被覆盖至少一 ...

  5. 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)

    FRP 是 Github 上开源的一款内网穿透工具,点击前往项目地址,该项目分为 frps 服务端和 frpc 客户端,通过在拥有公网 IP 的服务器上搭建服务端,然后在被穿透的机器上安装客户端,配置 ...

  6. 【Bug记录】defineEmits 在 TS 项目报错

    前言 单文件组件 <script setup> 是 Vue3.2 版本后非常流行的写法. 但是在开发过程中,按照官网使用 defineEmits ,结果项目报错,无法运行. 错误截图 Un ...

  7. nginx启动失败 Starting nginx nginx [fail]

    nginx -t :测试配置文件是否有语法错误 看看报什么错误,我的是忘记给权限了 nginx: [alert] could not open error log file: open() " ...

  8. Nginx 之fastcgi常用配置项说明

    在LNMP环境中,我们都知道nginx如果要解析php脚本语言,就必须通过配置fastcgi模块来提供对php支持,那么在配置fastcgi的时候,关于fastcgi配置项的值应该怎么设置才能让其发挥 ...

  9. 通过局域网访问连接 vite 或 Django 之类的项目

    博客地址:https://www.cnblogs.com/zylyehuo/ step1 将 vite 或 Django 类的项目启动 ip 设置为 0.0.0.0:端口 step2 查询本机电脑在当 ...

  10. nginx下增加https端口的方法

    一.进入根目录我是使用xshell进行远程连接服务器的,连接到服务器首先输入cd /进入到根目录在这里插入图片描述二.配置nginx.conf文件首先输入cd etc/nginx进入到nginx目录在 ...