Teleport&Suspense

vue3 新添加了一个默认的组件就叫 Teleport,我们可以拿过来直接使用,它上面有一个 to 的属性,它接受一个css query selector 作为参数,这就是代表要把这个组件渲染到哪个 dom 元素中

<!-- ModalDemo.vue -->
<template>
    <teleport to="#modal">
        <div id="center" v-if="isOpen">
            <h2>this is a modal</h2>
            <button @click="buttonClick"> Close</button>
        </div>
    </teleport>
</template>
<script lang="ts">
import {defineComponent} from 'vue'
export default defineComponent({
    props:{
        isOpen:Boolean,
    },
    emits:{
        // 'close-modal':(payload:any)=>{
        //     return payload.type=='close'
        // }
        'close-modal':null
    },
    setup(props,context){
        const buttonClick=()=>{
            context.emit('close-modal')
        }
        return {buttonClick}
        // context.emit('close-modal',{
        //     type:'hello'
        // })
    }
})
</script>
<style scoped>
#center{
    width: 200px;
    height: 200px;
    border: 2px solid black;
    background: white;
    position: fixed;
    left: 50%;
    top: 50%;
    margin-left: -100px;
}
</style>
<!-- index.html -->

<!-- App.vue -->
<template>
  <img alt="Vue logo" src="./assets/logo.png">
  <modaldemo :isopen="modalIsOpen" @close-modal="onModalClose">My Modal !!!</modaldemo>
  <button @click="openModal">openModal</button>
</template>

<script lang="ts">
import { ref } from 'vue';
import ModalDemo from './components/ModalDemo.vue';

export default {
  components: { ModalDemo },
  name: 'App',
  setup(){
    const modalIsOpen=ref(false)
    const openModal=()=>{
      modalIsOpen.value=true
    }
    const onModalClose=()=>{
       modalIsOpen.value=false
    }
    return {
      modalIsOpen,openModal,onModalClose
    }
  }
};
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

参考文档

在正确渲染组件之前进行一些异步请求是很常见的事。组件通常会在本地处理这种逻辑,绝大多数情况下这是非常完美的做法。
<suspense> </suspense>组件提供了另一个方案,允许将等待过程提升到组件树中处理,而不是在单个组件中。

  • 组件有两个插槽。它们都只接收一个直接子节点。default 插槽里的节点会尽可能展示出来。如果不能,则展示 fallback 插槽里的节点。
  • 重要的是,异步组件不需要作为 的直接子节点。它可以出现在组件树任意深度的位置,且不需要出现在和 自身相同的模板中。只有所有的后代组件都准备就绪,该内容才会被认为解析完毕。
  • 另一个触发 fallback 的方式是让后代组件从 setup 函数中返回一个 Promise。通常这是通过 async 实现的,而不是显式地返回一个 Promise
<!-- App.vue -->
<template>
  <img alt="Vue logo" src="./assets/logo.png">
  <suspense>
    <template #default>
      <async-show>
    </async-show></template>
    <template #fallback>
      <h1>Loading !!!...</h1>
    </template>
  </suspense>
  <suspense>
    <template #default>
      <dog-show>
    </dog-show></template>
    <template #fallback>
      <h1>Loading DogShow!!!...</h1>
    </template>
  </suspense>
</template>
<script lang="ts">
import AsyncShow from './components/AsyncShow.vue';
import DogShow from './components/DogShow.vue';
export default {
  components: { AsyncShow,DogShow },
};
</script>
<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
<!-- AsyncShow.vue -->
<template>
    <h1>{{result}}</h1>
</template>
<script>
import {defineComponent} from 'vue'
export default defineComponent({
    setup(){
        return new Promise((resolve)=>{
            setTimeout(()=>{
                return resolve({result:'this is AsyncShow.vue'})
            },3000)
        })
    }
})
</script>
<!-- DogShow.vue -->
<template>
<img :src="result&&result.message">
</template>
<script>
import axios from 'axios'
import {defineComponent} from 'vue'
export default defineComponent({
    async setup(){
        const rawData=await axios.get('https://dog.ceo/api/breeds/image/random')
        return {result:rawData.data}
    }
})
</script>
  • 一旦 的 default 插槽里的内容被解析,则它只有在 default 根结点被替换的时候才能被再次触发。而树里的深层嵌套组件不足以让 回到等待状态。
  • 如果根结点发生了变化,它会触发 pending 事件。然而,默认情况下,它不会更新 DOM 以展示 fallback 内容。取而代之的是,它会继续展示旧的 DOM,直到新组件准备就绪。这个行为可以通过 timeout prop 进行控制。这个值是一个毫秒数,告诉 组件多久之后展示 fallback。如果这个值是 0 则表示它在 进入等待状态时会立即显示。

参考文档

捕获suspense请求中的错误

import { onErrorCaptured,ref } from 'vue';
export default {
  components: { AsyncShow,DogShow },
  name: 'App',
  setup(){
    const error=ref(null)
    onErrorCaptured((e:any)=>{
      error.value=e
      return true
    })
    return {
      error
    }
  }
};

参考文档

Original: https://www.cnblogs.com/Dewumu/p/16059344.html
Author: 德乌姆列特
Title: Teleport&Suspense

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607054/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • linux 普通分区与lvm分区

    安装linux系统时 有时候会提示lvm分区与标准分区 首先普及一下lvm分区:lvm是 logical volume manager (逻辑卷管理),linux环境下对磁盘分区的…

    Linux 2023年6月14日
    083
  • list底层实现

    list和vector都是容器,只不过他们的存储结构不同,vector实际底层结构是顺序表,支持随机访问。list的底层结构带头双向链表,不支持随机访问。 但list的底层实现不同…

    Linux 2023年6月13日
    096
  • 【Prometheus+Grafana系列】监控MySQL服务

    前言 前面的一篇文章已经介绍了 docker-compose 搭建 Prometheus + Grafana 服务。当时实现了监控服务器指标数据,是通过 node_exporter…

    Linux 2023年6月7日
    082
  • [随记]-SpringMVC中的handler到底是什么东西

    HandlerMapping 初始化时候的 HandlerMapping 有,按顺序排列: requestMappingHandlerMapping beanNameHandler…

    Linux 2023年6月6日
    081
  • Mysql 5.7开启binlog日志

    Mysql 5.7开启binlog日志 前言 binlog是MySQL的二进制日志,并且是MySQL中最重要的日志。binlog记录了对MySQL数据库执行更改的所有操作,包括对数…

    Linux 2023年6月6日
    091
  • openssl 签署SAN证书

    openssl, x509, SAN 1、Prepare openssl config file. cat > my-openssl.cnf << EOF [ c…

    Linux 2023年6月6日
    077
  • JAVAssist字节码操作

    Java 动态性的两种常见实现方式 字节码操作 反射 运行时操作字节码可以让我们实现如下功能: 动态生成新的类 动态改变某个类的结构(添加/删除/修改新的属性/方法) 优势: 比反…

    Linux 2023年6月13日
    088
  • 基于eNSP的NAT/NAPT协议仿真实践

    一. 基本原理 eNSP(Enterprise Network Simulation Platform)是一款由华为提供的、可扩展的、图形化 操作的网络仿真工具平台,主要对企业网络…

    Linux 2023年6月8日
    080
  • 【原创】Linux虚拟化KVM-Qemu分析(一)

    背景 Read the fucking source code! –By 鲁迅 A picture is worth a thousand words. –…

    Linux 2023年6月8日
    087
  • 手把手教你搭建一个SpringBoot工程

    手把手教你搭建一个SpringBoot工程 首先进入Spring官网,下载Demo工程 像这样设置好 点击下载 将工程导入Idea并打开 在 application.propert…

    Linux 2023年6月14日
    0114
  • 【socket】在Linux下socket温度上报–客户端

    socket通信客户端 socket函数 * 代码实现 socket函数 int socket(int domain,int type,int protocol); 参数: dom…

    Linux 2023年6月13日
    099
  • Linux下定时自动备份Docker中所有SqlServer数据库

    给出一个备份的范例 #!/bin/bash #设置mssql备份目录 folder=/var/opt/mssql/data/databack/ day=date +%Y%m%d%H…

    Linux 2023年6月14日
    097
  • Spring5 学习笔记

    学习地址: B站-动力节点 个人代码: GitHub Spring 概述 1.1 Spring 简介 Spring Framework 是一个使用Java开发的、轻量级的、开源框架…

    Linux 2023年6月14日
    081
  • Shell:Shell基础

    Shell基础 一、shell定义 shell是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指…

    Linux 2023年5月28日
    077
  • 【转】对于任意的非负整数,统计其二进制展开中数位1的总数

    问题: 对于任意的非负整数,统计其二进制展开中数位1的总数。 解决: 在看这篇之前可以先看看上述这篇,这篇主要讨论其优化问题。 常规解法: O(logn): 无非就是每次取其二进制…

    Linux 2023年6月7日
    073
  • 用全域安全防范美国NSA对西工大的网络攻击

    上周写的一篇文章《全域安全:一种运行时安全管理模型》,向大家介绍了全域安全管理模型,它是如何在Laxcus分布式操作系统的分布环境下,解决了分布式应用业务的全流程安全管理问题。其中…

    Linux 2023年6月6日
    096
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球