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 UI框架的主题切换功能实现

    Vue UI框架的主题切换功能实现

    在如今,很多网页已经可以手动切换明亮模式和黑暗模式,网页的主题切换已经成为了一个常用的需求,因此,本文将从常见框架的处理方式总结一些相关的操作,对vue ui框架主题切换功能感兴趣的朋友跟随小编一起看看吧
    2022-12-12
  • vue3之Suspense加载异步数据的使用

    vue3之Suspense加载异步数据的使用

    本文主要介绍了vue3之Suspense加载异步数据的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • vue.js常用的自定义校验方式

    vue.js常用的自定义校验方式

    文章介绍了使用ElementUI时如何自定义校验规则,包括将校验逻辑封装为JavaScript文件,通过`validator`和`trigger`属性定义校验方法和触发条件等
    2026-04-04
  • Vue 电商后台管理项目阶段性总结(推荐)

    Vue 电商后台管理项目阶段性总结(推荐)

    这篇文章主要介绍了Vue 电商后台管理项目阶段性总结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • vue 监听 Treeselect 选择项的改变操作

    vue 监听 Treeselect 选择项的改变操作

    这篇文章主要介绍了vue 监听 Treeselect 选择项的改变操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • vue日历组件的封装方法

    vue日历组件的封装方法

    这篇文章主要为大家详细介绍了vue封装一个日历组件的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 详解vue 命名视图

    详解vue 命名视图

    这篇文章主要介绍了vue 命名视图的相关知识,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Vue项目Element表格对应字段映射显示方法:formatter格式化数据问题

    Vue项目Element表格对应字段映射显示方法:formatter格式化数据问题

    这篇文章主要介绍了Vue项目Element表格对应字段映射显示方法:formatter格式化数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • vue2.0实现分页组件的实例代码

    vue2.0实现分页组件的实例代码

    这篇文章主要介绍了vue2.0实现分页组件的实例代码,需要的朋友可以参考下
    2017-06-06
  • 如何解决elementUI打包上线后icon图标偶尔乱码问题

    如何解决elementUI打包上线后icon图标偶尔乱码问题

    文章描述了在使用若依框架开发过程中遇到的图标乱码问题,通过分析发现是由于sass编译器将Unicode编码转换为明文导致的,文章提供了四种处理方法:使用css-unicode-loader、升高sass版本、替换element-ui的样式文件和更换打包压缩方式
    2025-01-01

最新评论