Vue3新特性Suspense和Teleport应用场景分析

 更新时间:2024年07月02日 10:36:17   作者:扶苏1002  
本文介绍了Vue2和Vue3中的Suspense用于处理异步请求的加载提示,以及如何在组件间实现动态加载,同时,Teleport技术展示了如何在DOM中灵活地控制组件的渲染位置,解决布局问题,感兴趣的朋友跟随小编一起看看吧

一、Suspense【试验性,可能变动,生产环境请勿使用】

官方说明:在正确渲染组件之前进行一些异步请求是很常见的事。suspense允许将等待过程提升到组件树中处理,而不是在单个组件中。

实例: 有一个组件的一些数据需要异步请求,请求完成后再渲染。为了显示友好,我们会在请求返回前显示一个Loading。进入页面,显示 Loading,3秒后,显示为 Hello

1.1. vue2实现

在vue2中,通常我们是定义一个变量来操作这个loading的显示与否

<template>
  <div class="pager">
    <div v-if="loading">Loading</div>
    <div v-else>{{data}}</div>
  </div>
</template>
<script>
  export default {
    data() {
      return {
        loading: true,
        data: ''
      }
    },
    created() {
      this.load();
    },
    methods: {
      load() {
        this.loading = true;
        return new Promise((resolve) => {
		  setTimeout(()=>{
		    this.data= 'hello'
            this.loading = false;
			resolve('hello')
		  }, 3000)
	   })
      }
    }
  }
</script>

1.2. vue3-suspense 实现

1.2.1. 父组件

//父组件
<script setup>
import HelloWorld from './components/HelloWorld.vue'
</script>
<template>
	<suspense>
	  <template #default>
	    <HelloWorld/>
	  </template>
	  <template #fallback>
			Loading
		</template>
	</suspense>
</template>

1.2.2. 子组件-helloWold

//子组件 - HelloWorld
<script setup>
import { ref } from 'vue';
const data = ref('');
const load = function() {
	return new Promise((resolve) => {
		setTimeout(()=>{
			data.value = 'hello'
			resolve('hello')
		}, 3000)
	})
}
await load(); 
</script>
<template>
  {{data}}
</template>

关键点: await将setup隐性添加了一个async的关键字,也就是 Promise的返回
注意事项: 子组件的加载方式为异步加载 ,或者子组件的setup应返回一个Promise,async关键字为隐性的Promise返回。

二、Teleport【传送】

远距离传送, 可以将teleport内的element移到组件外的特定位置。

官方说明: Teleport 提供了一种干净的方法,允许我们控制在DOM中哪个父节点下渲染了 HTML,而不必求助于全局状态或将其拆分为两个组件。

优点: 添加组件的灵活性,原先由于布局、层级等原因【类似按钮和触发弹窗等】,需要拆分到不同位置【不同组件】的相关联操作,也可以更好的封装起来。

props:【官方摘要】

  • to[string]。必填,必须是有效的查询选择器或 HTMLElement (如果在浏览器环境中使用)。指定将在其中移动 内容的目标元素
  • disabled[boolean]。可选,此属性可用于禁用 的功能,这意味着其插槽内容将不会移动到任何位置,而是在你在周围父组件中指定了 的位置渲染。

Teleport 是一种能够将我们的模板移动到 DOM 中 Vue app 之外的其他位置的技术。

2.1. Teleport用法

用法非常简单,只需要使用 to 这个属性就可以把组件渲染到想要的位置

// 渲染到body标签下
<teleport to="body">
  <div class="modal">
    I'm a teleported modal!
  </div>
</teleport>

也可以使用

<teleport to="#some-id" />
<teleport to=".some-class" />
<teleport to="[data-teleport]" />

必须是有效的查询选择器或 HTMLElement。

2.2. 应用场景

当自己封装一个弹窗的时候,我们使用 position: fixed,当父元素使用 transform或者filter滤镜的时候,会使得position: fixed降级为absolute,这个时候我们就可以利用Teleport,把元素追加到body上面

position:fixed 降级为absolute的问题 见文末补充介绍

// 渲染到body标签下
<teleport to="body">
  <Modal></Modal>
</teleport>

补充:position:fixed 降级为absolute的问题

position:fixed 降级为absolute的问题

本篇文章汇总一下position:fixed 降级为absolute的情况

transform影响fixed

元素设置position:fixed后大家都知道可以让元素不跟随滚动条滚动(固定到视口),但是transform可以把position:fixed干掉让其降级成absolute

<div style="transform:scale(1);">
    <img src="mm1.jpg"style="position:fixed;" />
</div>

本身应该不动的图片因为父级设置了transform而变成了absolute的效果。

filter

CSS3滤镜(filter)

CSS3 中filter滤镜属性,也会把position:fixed干掉让其降级成absolute

到此这篇关于Vue3新特性Suspense和Teleport的文章就介绍到这了,更多相关Vue3 Suspense和Teleport内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue 获取元素额外生成的data-v-xxx操作

    vue 获取元素额外生成的data-v-xxx操作

    这篇文章主要介绍了vue 获取元素额外生成的data-v-xxx操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Vue 全家桶实现移动端酷狗音乐功能

    Vue 全家桶实现移动端酷狗音乐功能

    这篇文章主要介绍了Vue 全家桶实现移动端酷狗音乐功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • vue-dplayer视频播放器组件的使用详解

    vue-dplayer视频播放器组件的使用详解

    Vue-DPlayer是一个易于使用、高性能的基于Vue.js的视频播放器组件,这篇文章将为大家详细介绍一下vue-dplayer视频播放器组件的安装与使用,需要的小伙伴可以参考下
    2023-09-09
  • Vue.js学习笔记之常用模板语法详解

    Vue.js学习笔记之常用模板语法详解

    本篇文章主要介绍了Vue.js学习笔记之常用模板语法详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Vue3子组件向父组件传值的两种实现方式

    Vue3子组件向父组件传值的两种实现方式

    近期学习vue3的父子组件之间的传值,发现跟vue2的并没有太大的区别,这篇文章主要给大家介绍了关于Vue3子组件向父组件传值的两种实现方式,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • Vue-cli assets SubDirectory及PublicPath区别详解

    Vue-cli assets SubDirectory及PublicPath区别详解

    这篇文章主要介绍了Vue-cli assets SubDirectory及PublicPath区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • vue多页面项目中路由使用history模式的方法

    vue多页面项目中路由使用history模式的方法

    这篇文章主要介绍了vue多页面项目中路由如何使用history模式,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • 详解vue中多个有顺序要求的异步操作处理

    详解vue中多个有顺序要求的异步操作处理

    这篇文章主要介绍了vue中多个有顺序要求的异步操作处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • vue实现上传图片添加水印(升级版)

    vue实现上传图片添加水印(升级版)

    这篇文章主要为大家详细介绍了vue实现上传图片添加水印的升级版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • vue项目热更新的坑及解决

    vue项目热更新的坑及解决

    这篇文章主要介绍了vue项目热更新的坑及解决方案,具有很好的参考价值,希望对的大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04

最新评论