vue3.0新特性teleport是啥,用起来真香(开阔视野!)

news/2024/7/10 1:49:43 标签: vue, javascript, python, js, css
js_content">

前言

vue2.0时代,我们经常会有这样的需求,写代码逻辑的时候希望将组件写在某个模板之下,因为这样我们很好的使用组件内部的状态数据,控制组件的展示形态。但是从技术的角度上我们又希望将这段代码移到DOMVue app之外的其他位置。

举个简单的例子,我们在使用modal组件的时候,我们将它放在了我们的模板template里面,但是由于modal组件希望位于页面的最上方,这时候我们将modal组件挂载在body上面是最好控制的,我们能够很好的通过zIndex来控制modal的位置,当他嵌套在templat里面的时候就不那么容易了。

vue2.0中的实现

vue2.0中我在写这个组件的时候是通过手动的形式来进行挂载的,我写了一个vue指令来进行这个操作,帮助我将modal组件挂载到body上面去,专这样也能够很好的通过控制zIndex来控制modal的展示。

function insert(el) {
  const parent = el.parentNode;
  if (parent && parent !== document.body) {
      parent.removeChild(el);
      document.body.appendChild(el);
  }
}

export default (typeof window !== 'undefined' ? {
  inserted(el, { value }) {
      if (value) {
          insert(el);
      }
  },
  componentUpdated(el, { value }) {
      if (value) {
          insert(el);
      }
  },
} : {});

上面的代码其实就是简单的将modal从他原始挂载的父节点移除,然后挂载到body上去,通过手动的形式来重新挂载,能够很好的解决这种问题,当然上面只是简单的逻辑,如果需要考虑卸载等其他逻辑代码还得增加。

<template>
  <div class="modal" v-to-body="show" v-if="show">
    <div class="modal-mask" @click="close"></div>
    <slot></slot>
  </div>
</template>

<script>
import "./style.scss";
import toBody from "../directives/to-body";
export default {
  props: {
    show: Boolean,
  },
  directives: {
    toBody,
  },
  methods: {
    close() {
      this.$emit("close");
    },
  },
};
</script>

说实话vue2.0中的实现其实是没啥问题的,只是不是很优雅,需要额外的代码控制,所以vue3.0中直接带来了Teleport-任意传送门

具体代码参考vue2.0-modal: https://codesandbox.io/s/vue20-modal-sc1rq

什么是Teleport

Teleport能够直接帮助我们将组件渲染后页面中的任意地方,只要我们指定了渲染的目标对象。Teleport使用起来非常简单。

<template>
  <teleport to="body" class="modal" v-if="show">
    <div class="modal-mask" @click="close"></div>
    <slot></slot>
  </teleport>
</template>

<script>
import "./style.scss";
export default {
  props: {
    show: Boolean,
  },
  methods: {
    close() {
      this.$emit("close");
    },
  },
};
</script>

上面的代码我们就能够很简单的实现之前vue2.0所实现的功能。

具体代码参考vue3.0-modal: https://codesandbox.io/s/vue3-modal-x2lud

注意点

与 Vue components 一起使用

在这种情况下,即使在不同的地方渲染child-component,它仍将是parent-component的子级,并将从中接收name prop

这也意味着来自父组件的注入按预期工作,并且子组件将嵌套在Vue Devtools中的父组件之下,而不是放在实际内容移动到的位置。

const app = Vue.createApp({
  template: `
    <h1>Root instance</h1>
    <parent-component />
  `
})

app.component('parent-component', {
  template: `
    <h2>This is a parent component</h2>
    <teleport to="#endofbody">
      <child-component name="John" />
    </teleport>
  `
})

app.component('child-component', {
  props: ['name'],
  template: `
    <div>Hello, {{ name }}</div>
  `
})
在同一目标上使用多个teleport

当我们将多个teleport送到同一位置时会发生什么?

<teleport to="#modals">
  <div>A</div>
</teleport>
<teleport to="#modals">
  <div>B</div>
</teleport>

<!-- result-->
<div id="modals">
  <div>A</div>
  <div>B</div>
</div>

我们可以看到对于这种情况,多个teleport组件可以将其内容挂载到同一个目标元素。顺序将是一个简单的追加——稍后挂载将位于目标元素中较早的挂载之后。

总结

一句话来描述Teleport就是一种将代码组织逻辑依旧放在组件中,这样我们能够使用组件内部的数据状态,控制组件展示的形式,但是最后渲染的地方可以是任意的,而不是局限于组件内部

- END -

点赞 + 在看 + 分享,一键三连,幸福满满!

最后

如果你觉得这篇内容对你挺有启发,我想邀请你帮我三个小忙:

  1. 点个「在看」,让更多的人也能看到这篇内容(喜欢不点在看,都是耍流氓 -_-)

  2. 欢迎加我微信「qianyu443033099」拉你进技术群,长期交流学习...

  3. 关注公众号「前端下午茶」,持续为你推送精选好文,也可以加我为好友,随时聊骚。

点个在看支持我吧,转发就更好了


http://www.niftyadmin.cn/n/717496.html

相关文章

C# 智能手机开发的疑惑

通过资料了解到C#可以开发智能手机或是手机软件 但我疑惑的是如果用微软的C#是基于.NET框架&#xff08;.net Framework&#xff09;平台下运行的&#xff0c;如果开发出了 手机软件到时候手机平台必须安装一个20多兆的框架平台真的很不方便&#xff0c;手机内存卡的容量也就几…

层次型HMM模型

来源&#xff1a;http://en.wikipedia.org/wiki/Hierarchical_hidden_Markov_model

Win 7 eclipse访问虚拟机上hadoop

因为hadoop安装在虚拟机里&#xff0c;虚拟机同时带不动eclipse和hadoop&#xff0c;就打算在windows下eclipse访问虚拟机里的hadoop&#xff0c;搜索了一下&#xff0c;需要做如下配置。 操作系统&#xff1a;Windows 7 hadoop&#xff1a;1.2.1 首先配置eclipse&#xff0c;安…

【转】模仿QQ\MSN的网页右下角弹出层

DIV: <div id"winpop"><div class"title">操作结果&#xff1a;<span class"close"onclick"tips_pop()">X</span></div><div id"DivOperateResult"class"con"></div>…

Matlab动画模拟分子布朗运动的示例

Matlab动画模拟分子布朗运动的示例 %Brownian motion clf; n20; s0.02; x rand(n,1)-0.5; y rand(n,1)-0.5; h plot(x,y,.); axis([-1 1 -1 1]) axis square grid off set(h,EraseMode,xor,MarkerSize,18) grid on; title(Press Ctl-C to stop); while 1 drawn…

我不知道你是在一个多线程out该--【ITOO】

仍向系统负载作出太慢。卡而发愁太&#xff1f;我不知道多线程&#xff0c;你们out该。最近花了大约两三天。多-threaded。通过团队的交流&#xff0c;多线程有更深入的思考。希望可以加入&#xff29;&#xff34;&#xff2f;&#xff2f;目里面&#xff0c;优化一下系统性能…

C#.net技术内幕04-集合

锯齿数组:锯齿数组就是数组的数组。例如&#xff1a;Int[] anewint[][]{ New int[]{1&#xff0c;1&#xff0c;1}&#xff1b; New int[]{23&#xff0c;12}&#xff1b;}2.Out与ref&#xff1a;将数组作为参数传递时&#xff0c;在调用函数之前不需要初始化…

sql 左联 右联 内联的区别

如有表a(col1,col2),a,1b,1b(col1,col2)a,3c,2内部联接是指只返回符合联接条件的资料&#xff0c;如select * from a join b on a.col1 b.col1 只返回符合条件a.col1 b.col1的资料结果如下a,1,a,3左外联接不仅返回符合条件的资料还返回左表中的资料如select * from a left jo…