首页 > 其他分享 >Vue 3 的 <teleport> 组件封装为自定义指令

Vue 3 的 <teleport> 组件封装为自定义指令

时间:2024-06-08 20:12:10浏览次数:25  
标签:el Vue 封装 自定义 元素 指令 targetElement 组件

<Teleport> 是一个内置组件,它可以将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。

https://cn.vuejs.org/guide/built-ins/teleport.html

为了更加简便灵活,可以将 Vue 3 的 <teleport> 组件类似的功能封装为自定义指令。当然,但在某些情况下,直接使用 <teleport> 组件会更合适。

自定义指令的实现步骤

https://cn.vuejs.org/guide/reusability/custom-directives.html

  1. 创建自定义指令
    定义一个自定义指令 v-teleport,并在其 mountedunmounted 钩子中进行 DOM 操作。

  2. 挂载目标元素
    mounted 钩子中,将元素移动到指定的目标容器中。

  3. 卸载目标元素
    unmounted 钩子中,将元素从目标容器中移除。

实现代码

首先,创建一个自定义指令 v-teleport

// teleportDirective.js
export default {
  mounted(el, binding) {
    const targetSelector = binding.value || 'body';
    const targetElement = document.querySelector(targetSelector);
    if (targetElement) {
      targetElement.appendChild(el);
    } else {
      console.warn(`Target element "${targetSelector}" not found`);
    }
  },
  unmounted(el, binding) {
    const targetSelector = binding.value || 'body';
    const targetElement = document.querySelector(targetSelector);
    if (targetElement && targetElement.contains(el)) {
      targetElement.removeChild(el);
    }
  }
};

然后,在Vue 组件或主应用实例中注册这个自定义指令。

// main.js
import { createApp } from 'vue';
import App from './App.vue';
import teleportDirective from './teleportDirective';

const app = createApp(App);

app.directive('teleport', teleportDirective);

app.mount('#app');

最后,在组件中使用这个自定义指令。

<template>
  <div v-teleport="'#target-container'">
    This content will be teleported
  </div>
</template>

<script>
export default {
  name: 'MyComponent'
};
</script>

<!-- 目标容器 -->
<div id="target-container"></div>

解释

  1. 指令绑定值

    • binding.value 是指令的绑定值。在这个例子中,我们使用了一个选择器字符串(如 '#target-container')来指定目标元素。
  2. 挂载时的操作

    • mounted 钩子中,我们通过 document.querySelector 找到目标元素,并将指令绑定的元素(el)追加到目标元素中。
  3. 卸载时的操作

    • unmounted 钩子中,我们确保在目标元素中删除这个元素,以防内存泄漏。

通过这种方式,可以将元素移动到指定的 DOM 位置,类似于 <teleport> 组件的功能。这种自定义指令的方法提供了更多的灵活性,但在大多数情况下,使用 Vue 内置的 <teleport> 组件会更简单和可靠。


这样简洁很多了,不需要再套一层

标签:el,Vue,封装,自定义,元素,指令,targetElement,组件
From: https://www.cnblogs.com/echohye/p/18238898

相关文章

  • VUE3 表单输入绑定
    在前端处理表单时,我们常常需要将表单输入框的内容同步给JavaScript中相应的变量。手动连接值绑定和更改事件监听器可能会很麻烦:template<input:value="text"@input="event=>text=event.target.value">v-model 指令帮我们简化了这一步骤:template<inputv-mod......
  • [ROS自定义消息问题]ImportError: cannot import name ‘GQCNNGrasp‘ from ‘gqcnn_r
         在使用ROS运行Python代码时,经常会遇到无法引用自定义消息文件的情况。这其实是一个比较常见的问题,通常是由于ROS找不到消息文件所在的路径导致的。问题描述:在ROS中运行Python代码时,如果尝试导入自定义消息文件,可能会遇到类似如下的错误:ImportError:Nomodule......
  • ssm604基于Java Web的怀旧唱片售卖系统+vue【已测试】
    前言:......
  • vue 面试题
    为什么组件的data必须是一个函数 *   原因:将来多个组件打包后会合并到一起一旦组件之间有data数据重名就可能出现覆盖的情况 导致打包之后数据混乱 *  所以组件的data是一个函数就形成了一个闭包 数据就变成了局部变量就算都打包合并到一起不同的 *......
  • 封装el-select滚动底部加载更多
    封装el-select滚动底部加载更多vue2实现el-select下拉列表滚动加载更多数据父组件页面使用<template><LoadMoreSelectv-model="selectValue":fetchOptions="fetchStockLocationData"keyField="Cid"labelField="Code"valu......
  • 同星TSMaster中如何自定义E2E校验算法
    文章目录前言一、自定义E2E算法教程1.定义checksum算法2.定义【CAN预发送事件】3.E2E报文信号仿真4.运行工程二、TSMaster配置E2E教程1.激活仿真报文2.E2E配置三.小结前言最近因项目需要,用到TSMaster进行E2E校验算法实现。第一次使用TSMaster,把整个的过程做一个记......
  • vue3 + arcgis.js4.x---线段SimpleLineSymbol
    //polylineconstpolylineGraphic=newGraphic()polylineGraphic.geometry={type:'polyline',paths:[[117.227239,31.820586],[116.227239,33.820586]]}polylineGraphic.symbol=newSimpleLineSymbol({color:'#ff0000&#......
  • vue3 + arcgis.js4.x---面SimpleFillSymbol
    //polygonconstpolygonGraphic=newGraphic()polygonGraphic.geometry={type:'polygon',rings:[[117.227239,31.820586],[116.227239,33.820586],[117.227239,33.820586]]}polygonGraphic.symbol=newSimpleFillSymbol({......
  • 【手撕面试题】Vue(高频知识点四)
            每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么?想过之后再与答案比对,是不是会更好一点,当然如果你有比我更好的答案,欢迎评论区留言,一起探讨技术之美。目录面试官:请简述一下k......
  • 【计算机毕业设计】ssm714实验室预约管理系统+vue
    身处网络时代,随着网络系统体系发展的不断成熟和完善,人们的生活也随之发生了很大的变化,人们在追求较高物质生活的同时,也在想着如何使自身的精神内涵得到提升,而读书就是人们获得精神享受非常重要的途径。为了满足人们随时随地只要有网络就可以看书的要求,实验室预约管理被开发......