【vue2】Vue Portal 和【vue3】Teleport

这篇具有很好参考价值的文章主要介绍了【vue2】Vue Portal 和【vue3】Teleport。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Vue Portal (用于vue2的插件)和 Vue3 Teleport (vue3内置特性)是两个可以在vue应用中更方便地控制组件渲染位置的工具

它们都可以将组件渲染到DOM结构的特定位置,而不是跟随父组件的渲染位置

Vue Portal

1、简单易用,Vue Portal是一个独立的插件,可以与vue2无缝集成,无需额外配置
2、可以在任何DOM元素中渲染组件,可以将组件渲染到应用之外的DOM元素中,例如body元素
3、可以通过使用不同的target属性,将组件渲染到不同的DOM元素中
4、对版本有限制,Vue Portal是为vue2设计的
5、需要额外的依赖,Vue Portal需要依赖第三方库portal-vue

Vue Portal使用:

1、安装

npm i `portal-vue`

2、main.js中引入

import PortalVue from 'portal-vue'
Vue.use(PortalVue)

3、PortalVue 包含两个组件,portal组件和portal-target组件,将portal组件中的内容转至portal-target组件所在的地方

1、A父页面中使用portal插件,to就是要去的DOM元素,destination${place}中的place是动态变量,假设值为1

<portal :to="`destination${place}`"
              >
              //作用域插槽,多个父组件需要传送内容,根据条件动态传送
                <div slot-scope="props" v-if="props.value == 'personId'">
                  <el-form-item
                    class="customFormItem"
                    :label="props.label ? `${props.label}:` : '申请人:'"
                    prop="personId"
                  >   
                        <el-input
     			   class="options"
    			    type="text"     
      			  v-model="form.personId"  
      />           
                  </el-form-item>
                </div>
              </portal>

2、B父页面中使用portal插件,to就是要去的DOM元素,destination${place}中的place是动态变量,假设值为2

<portal :to="`destination${place}`"
              >
              //作用域插槽,多个父组件需要传送内容,根据条件动态传送
                <div slot-scope="props" v-if="props.value == 'empName'">
                  <el-form-item
                    class="customFormItem"
                    :label="props.label ? `${props.label}:` : '领用人:'"
                    prop="empName"
                  >     
                        <el-input
        class="options"
        type="text"  
        v-model="form.empName"   
      />         
                  </el-form-item>
                </div>
              </portal>

3、子组件中使用portal-target,name就是传送地点, :name="destination${template.place}"中的place动态接收,假设A组件传过来的是1,即A组件portal包裹的内容将放在portal-target内, :name=“destination1”,假设B组件传过来的是2,即A组件portal包裹的内容将放在portal-target内, :name=“destination2”,很好理解吧

<template>
  <div class="formItem">
    <portal-target  //示例中A组件或B组件portal包裹的内容显示在这里
      v-if="template.isSend"
      :name="`destination${template.place}`"
      :slot-props="{ disabled, ...template }"
      multiple
    ></portal-target>
    <el-form-item
      v-else
      ref="formItem"
      :label="template.label + ':'"
      :prop="template.value"
      :title="template.label + ':'"
      :style="{
        width: template.editor === 'el-input-textarea' ? '80%' : '45.8%',
      }"
    >
      <el-input
        class="options"
        type="text"  
        v-model="template.value"   
      />         
        </el-form-item>
  </div>
</template>

vue 3 Teleport

1、vue3的内置特性,不需要额外的依赖
2、语法简洁,Vue3 Teleport 有一个简洁的语法来标记要将组件渲染到的位置
3、更好的性能,Vue3 Teleport的渲染机制得到了改进
4、仅适用于vue3项目
5、需要更多配置,在一些复杂场景下,可能需要更复杂的配置

vue 3 Teleport使用

<template>
  <teleport to="body">
    <MyTooltip v-if="isTooltipOpen" />
  </teleport>
  <button @click="toggleTooltip">Toggle Tooltip</button>
</template>

<script>
import { ref } from 'vue';

export default {
  components: {
    Teleport,
    MyTooltip,
  },
  setup() {
    const isTooltipOpen = ref(false);

    const toggleTooltip = () => {
      isTooltipOpen.value = !isTooltipOpen.value;
    };

    return {
      isTooltipOpen,
      toggleTooltip,
    };
  },
};
</script>

【vue3】Teleport 示例:
假设有一个三级嵌套的组件结构

App.vue

<template>
  <div class="app">
    <h3>我是APP组件</h3>
    <child />
  </div>
</template>

<script setup lang="ts">
</script>
<style >
.app {
  background-color: grey;
  padding: 10px;
}
</style>

child.vue

<template>
  <div class="child">
    <h3>我是child组件</h3>

    <myson />
  </div>
</template>

<script >
import { ref } from "vue";
export default {
  name: "child",
};
</script>
<style scoped >
.child {
  background: pink;
  padding: 10px;
}
</style>

myson.vue

<template>
  <div class="myson">
    我是myson 组件
    <Dialog />
  </div>
</template>

<script setup lang="ts">
</script>
<style scoped >
.myson {
  background: rgb(43, 198, 226);
  padding: 10px;
}
</style>

Dialog.vue

<template>
  <div>
    <button @click="isShow = true">点我显示</button>
    <div class="dialog" v-if="isShow">
      <div>内容</div>
      <div>内容</div>
      <div>内容</div>
      <div>内容</div>
      <div>内容</div>
      <div>内容</div>
      <div>内容</div>
      <div>内容</div>
      <div>内容</div>
      <button @click="isShow = false">点我隐藏</button>
    </div>
  </div>
</template>

<script>
import { ref } from "vue";
export default {
  name: "dialog",
  setup() {
    let isShow = ref(false);
    return {
      isShow,
    };
  },
};
</script>

<style >
.dialog {
  width: 300px;
  height: 300px;
  background-color: green;
}
</style>

【vue2】Vue Portal 和【vue3】Teleport,vue.js,javascript,前端
在myson组件中再引入一个类似于弹窗的组件,每次切换显示与隐藏的时候,弹窗组件的内容会撑开所有组件的高度
【vue2】Vue Portal 和【vue3】Teleport,vue.js,javascript,前端
弹窗组件包裹在三层组件内
【vue2】Vue Portal 和【vue3】Teleport,vue.js,javascript,前端
如果想修改弹窗的位置,开启定位的话,定位是针对父元素,光是一层一层往上定位,如果中间还有别的定位,最后就会很容易把弹窗的位置定偏了
【vue2】Vue Portal 和【vue3】Teleport,vue.js,javascript,前端
用Teleport组件可以把弹窗传送走,你想让它在谁下面就可以在谁的下面直接展示:

<template>
  <div>
    <button @click="isShow = true">点我显示</button>
    <teleport to="body">
      <div class="dialog" v-if="isShow">
        <div>内容</div>
        <div>内容</div>
        <div>内容</div>
        <div>内容</div>
        <div>内容</div>
        <div>内容</div>
        <div>内容</div>
        <div>内容</div>
        <div>内容</div>
        <button @click="isShow = false">点我隐藏</button>
      </div>
    </teleport>
  </div>
</template>

<script>
import { ref } from "vue";
export default {
  name: "dialog",
  setup() {
    let isShow = ref(false);
    return {
      isShow,
    };
  },
};
</script>

<style >
.dialog {
  width: 300px;
  height: 300px;
  background-color: green;
}
</style>

用了teleport传送到body之后,dialog与app就是平级的关系了
除了传送到body,还可以选择css选择器进行传送
【vue2】Vue Portal 和【vue3】Teleport,vue.js,javascript,前端文章来源地址https://www.toymoban.com/news/detail-639069.html

到了这里,关于【vue2】Vue Portal 和【vue3】Teleport的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 持续不断更新中... 自己整理的一些前端知识点以及前端面试题,包括vue2,vue3,js,ts,css,微信小程序等

    答: 在普通的前端项目工程中,在script标签中增加setup即可使用api 使用setup()钩子函数 答: 不要在计算属性中进行异步请求或者更改DOM 不要直接修改computed的值 区别: 计算属性值基于其响应式依赖被缓存,意思就是只要他之前的依赖不发生变化,那么调用他只会返回之前缓

    2024年02月11日
    浏览(39)
  • Vue3中 内置组件 Teleport 详解

    1. 基本概念 1.1 简单理解 不管是 Vue2 还是 Vue3 中都有内置组件的存在,如 component 内置组件、transition 内置组件等等。内置组件就是官方给我们封装的全局组件,我们直接拿来用就可以了。 在 Vue3 中新增了 Teleport 内置组件,先来看下官方文档是怎么解释的。 通俗解释: tele

    2024年01月25日
    浏览(24)
  • 【前端面经】Vue3和Vue2的区别

    Vue是一种非常流行的JavaScript框架,因其易用性和灵活性在开发人员中备受欢迎。Vue2是Vue框架的上一个重要版本,于2016年发布。但是,Vue3是最新版本的Vue框架,于2020年正式发布并带来了一些重大变化。本文将探讨Vue3和Vue2之间的主要区别。 Vue3的一个显着优势是其更小的代码

    2024年02月02日
    浏览(73)
  • 从Vue2到Vue3, 一键升级前端开发技能

    本文的目的,是为了让已经有 Vue2 开发经验的   人   ,快速掌握 Vue3 的写法。 因此,   本篇假定你已经掌握 Vue 的核心内容   ,只为你介绍编写 Vue3 代码,需要了解的内容。 首先,Vue3 新增了一个叫做组合式 api 的东西,英文名叫 Composition API 。因此 Vue3 的  script  现在支

    2024年02月08日
    浏览(63)
  • 关于前端框架vue2升级为vue3的相关说明

    一些框架需要升级 当前(202306) Vue 的最新稳定版本是 v3.3.4 。Vue 框架升级为最新的3.0版本,涉及的相关依赖变更有: 前提条件:已安装 16.0 或更高版本的Node.js(摘) 必须的变更:核心库vue@23、路由vue-router@34、状态管理vuex@34 构建工具链: Vue CLI Vite(摘) 状态管理: Vuex Pi

    2024年02月15日
    浏览(43)
  • uniapp引入全局js,vue2/vue3不同方式引入

    Hi I’m Shendi uniapp引入全局js,vue2/vue3不同方式引入 最近写小程序,个人开发,选用了 uni-app 进行开发 选用的 vue3 版本 因为我用的 vue3 版本,在这里踩了没学过vue3的坑,用vue2引入全局js的方式使用,导致undefined… Vue2 版引入全局js的方法如下 将js放到项目内,一般放到自建的

    2024年02月03日
    浏览(30)
  • 前端vue2、vue3去掉url路由“ # ”号——nginx配置

    大家好,我是yma16,本文分享关于vue2、vue3去掉url路由 # 号——nginx配置。 html的 hash模式 HTML的hash模式指的是URL中的锚点部分(#后面的内容)被用于在单个页面中显示不同的内容,而不是导航到不同的页面。例如: 在这个示例中, #about 部分是一个锚点,用于在页面上显示关

    2024年02月11日
    浏览(51)
  • Vue2和Vue3是Vue.js框架的两个主要版本,它们之间有以下区别

    性能优化:Vue3在内部进行了重写,采用了更高效的虚拟DOM算法,使得渲染速度更快,性能更好。 更小的体积:Vue3的体积比Vue2更小,这意味着更快的下载和加载速度。 Composition API:Vue3引入了Composition API,它是一种新的组合式API,可以更好地组织和重用组件逻辑,使得代码更

    2024年02月15日
    浏览(38)
  • 前端经典面试题 | 吊打面试官系列 之 Vue2和Vue3的区别

    🖥️ 前端经典面试题 吊打面试官 专栏:Vue2和Vue3的区别 🧑‍💼 个人简介:一个不甘平庸的平凡人🍬 ✨ 个人主页:CoderHing的个人主页 🍀 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️ 👉 你的一键三连是我更新的最大动力❤️ 目录 一、回答点 二、深入回答 监测机制

    2024年01月16日
    浏览(36)
  • Composition API 的优势、新的组件(Fragment,Teleport,Suspense)【Vue3】

    使用传统OptionsAPI中,新增或者修改一个需求,就需要分别在data,methods,computed里修改。 我们可以更加优雅的组织我们的代码,函数。让相关功能的代码更加有序的组织在一起。 在Vue2中:组件必须有一个根标签 在Vue3中:组件可以没有根标签,内部会将多个标签包含在一个

    2024年02月02日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包