Vue3中<Teleport/>组件踩坑与异步组件运用

3 篇文章 0 订阅
3 篇文章 0 订阅

重点:!这个组件要在你想要传送的DOM加载完成之后才能使用,不然是传送不了的。

官方释义: 是一个内置组件,它可以将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。

作用场景:就比如说你想展示一个放大缩小的图片到整个页面上,但是又受到了例如:relative,absolute等定位的影响,运用这个组件或许是一个不错的方法,毕竟是官方提供的。

这里看到一个up主大概说了一下:

13 Teleport

解决teleport无法获取DOM的问题:采用异步组件,这里分为两个版本:一个是插件的,说是提升效率,其实就是判断是否滑动到dom节点的位置,实现起来并不复杂,一个是未采用插件的普通形式,后续还有一个异步组件延迟加载的一个运用(上代码,其实你跑一遍就知道了)

index.vue
普通版本

<template>
  <div>
    <h1>父组件内容</h1>

    <div id="childrenOne">#childrenOne</div>
    <div id="childrenTwo">#childrenTow</div>
    <A </A>
    <B></B>
  </div>
</template>

<script setup>
import { useIntersectionObserver } from "@vueuse/core";
// import A from "./a.vue";
import B from "./b.vue";
import C from "./c.vue";
const A = defineAsyncComponent(() => import("./a.vue"));
</script>

<style>
</style>

A.vue

<template>
  <div>
    <h1>父组件内容</h1>

    <div id="childrenOne">#childrenOne</div>
    <div id="childrenTwo">#childrenTow</div>
    <A </A>
    <B></B>
  </div>
</template>

<script setup>
// import A from "./a.vue";
import B from "./b.vue";
import C from "./c.vue";
const A = defineAsyncComponent(() => import("./a.vue"));
</script>

<style>
</style>

b.vue

<template>
  <div>这是b组件</div>
</template>

<script>
export default {};
</script>

<style scoped>
div {
  width: 100vw;
  height: 100vh;
}
</style>

异步组件:插件版本

index.vue
记得瞄一眼这里:记得看target这个属性,它拿到的是一个dom元素,我推测这个是检测是不是已经到这个组组件的位置了,如果到了就显示,没到就不显示。

<template>
  <div>
    <h1>父组件内容</h1>

    <div id="childrenOne">#childrenOne</div>
    <div id="childrenTwo">#childrenTow</div>

    <B></B>
    <div ref="target">
      <A v-if="targetIsVisible"></A>
    </div>
  </div>
</template>

<script setup>
import { useIntersectionObserver } from "@vueuse/core";
// import A from "./a.vue";
import B from "./b.vue";
const A = defineAsyncComponent(() => import("./a.vue"));
// target是一个dom
const target = ref(null);
const targetIsVisible = ref(false);
const { stop } = useIntersectionObserver(target, ([{ isIntersecting }]) => {
  console.log(isIntersecting);

  if (isIntersecting) targetIsVisible.value = isIntersecting;
});
</script>

<style>
</style>

a.vue

<template>
  <div>
    <h1>子组件内容</h1>
    <Teleport :to="teleportValue"><div>传送组件内容</div> </Teleport>
    <button @click="teleportChange">修改传送组件</button>
  </div>
</template>

<script setup>
import { useIntersectionObserver } from "@vueuse/core";
let teleportValue = ref("#childrenTwo");
let teleportChange = () => {
  teleportValue.value = "#childrenOne";
  console.log(teleportValue.value);
};
</script>

<style>
</style>

单纯的使用异步组件

ps:为什么使用异步组件,使用异步组件可以实现分包加载,减小单个包的体积。用到的时候再进行加载,你看我这个可能理解不了,你把我的代码跑一边,然后打包一下,你就可以很直观的看到了
index.vue

    <Suspense>
      <template #default> <B></B></template>
      <template #fallback>加载中1</template>
    </Suspense>
//一定要是用suspense,官方提供的

b.vue

<template>
  <div>这是b组件{{ list }}</div>
</template>

<script setup>
import axios from "axios";
let list = ref([]);
let res = await axios.get("www.baidu.com");
// list.value = res.data.data;
list.value = res;
</script>

<style scoped>
div {
  width: 100vw;
  height: 100vh;
}
</style>

defineAsyncComponent使用(我这里主要是想延迟加载一下)

const AsyncComp = defineAsyncComponent({
  // 加载函数
  loader: () => import("./Foo.vue"),

  // 加载异步组件时使用的组件
  loadingComponent: Loading,
  // 展示加载组件前的延迟时间,默认为 200ms
  delay: 200,

  // 加载失败后展示的组件
  errorComponent: Error,
  // 如果提供了一个 timeout 时间限制,并超时了
  // 也会显示这里配置的报错组件,默认值是:Infinity
  timeout: 30000,
});
这段代码是一个 Vue.js 的单文件组件,包含了一个模板 `<template>` 和组件的结构。 在模板组件的内容被包含在一个 `div` 标签,而每个组件都被使用自定义标签的形式引入,例如 `<header-part />`、`<search />`、`<category />` 等等。这些自定义标签的实现在 Vue.js 的 JavaScript 代码定义。 具体来说: - `<header-part />` 组件用于渲染页面的头部,包括网站的 logo、导航栏等等。 - `<search />` 组件用于渲染页面的搜索栏。 - `<category />` 组件用于渲染商品分类列表。 - `<rotation />` 组件用于渲染轮播图,展示一些特别推荐的商品信息。 - `<erect-rotation />` 组件用于渲染竖向的轮播图,也是用于展示推荐商品信息的。 - `<serve />` 组件用于渲染页面的服务列表。 - `<sec-kill />` 组件用于渲染秒杀商品列表。 - `<recommend />` 组件用于渲染推荐商品列表。 - `<my-footer />` 组件用于渲染页面的底部信息。 组件的实现代码应该在 JavaScript ,通过 Vue.js组件定义方式来定义,例如: ```javascript Vue.component('header-part', { // 组件的选项 }) ``` 这样的组件定义方式需要在 Vue.js 的入口 JavaScript 文件进行定义,然后才能在模板使用。 总体来说,这段代码是一个典型的 Vue.js 单文件组件,用于构建京东商城页面的组件化。通过将页面拆分为多个组件,可以更加方便地管理和维护页面的代码,并且可以实现代码的重用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值