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)

大家都在看

  • 设计模式——-建造者模式(生成器模式)

    建造者模式(生成器模式)定义:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 建造者模式中的4个角色: Product产品类 通常是实现了模板方法模式…

    Linux 2023年6月7日
    0103
  • WEB自动化-10-Page Object 模型

    10 Page Object 模型 10.1 概述 在针对一个WEB页面编写自动化测试用例时,需要引用页面中的元素( 数据)才能进行操作( 动作)并显示出页面内容。如果编写的测试用…

    Linux 2023年6月7日
    080
  • Spring事务(三)-事务失效场景

    有时候,我们明明在类或者方法上添加了 @Transactional注解,却发现方法并没有按事务处理。其实,以下场景会导致事务失效。 1、事务方法所在的类没有加载到Spring IO…

    Linux 2023年6月6日
    094
  • Python中str()和repr()的区别

    其实用处就是最大的区别了:str()主要用来为终端用户输出一些信息,而repr()主要用来调试;同时后者的目标是为了消除一些歧义(例如浮点数的精度问题),前者主要为了可读。 In …

    Linux 2023年6月8日
    0113
  • spingboot使用redis连接池报错

    配置如下,增加了连接池相关 redis: host: localhost port: 6379 database: 7 lettuce: pool: max-active: 20 …

    Linux 2023年5月28日
    091
  • 由乐观锁延伸出的知识

    锁是网络数据库中的一个非常重要的概念,当多个用户同时对数据库并发操作时,会带来数据不一致的问题,所以,锁主要用于多用户环境下保证数据库完整性和一致性以商场的试衣间为例,每个试衣间都…

    Linux 2023年6月7日
    077
  • FusionAccess桌面云安装(windows AD方法)

    创建FusionAccess虚拟机 选择自定义 默认兼容 选择稍后安装操作系统 选择Linux SUSE Linux 名字位置自己选择 选择最少4个处理器 选择最少8G内存 选择仅…

    Linux 2023年6月8日
    0107
  • 编程入门之字符编码与乱码

    ——”为什么服务器收到的请求或者打开的文本文件有时会乱码?” ——”因为编码不对。” ——”编码的本质是什么?为什么编码…

    Linux 2023年6月13日
    092
  • Linux 命令行设置网络代理

    echo $SHELL/usr/bin/zsh 根据当前的shell类型来设置,我这里以zsh为例,vim ~/.zshrc export ALL_PROXY=”htt…

    Linux 2023年6月6日
    0195
  • 前几天看到微信多开方式

    @echo offset wechatpath=WeChat.exeecho. echo. echo —————&#82…

    Linux 2023年6月14日
    098
  • 学习一下 Spring Security

    一、Spring Security 1、什么是 Spring Security? (1)基本认识Spring Security 是基于 Spring 框架,用于解决 Web 应用安…

    Linux 2023年6月11日
    095
  • Java实现哈希表

    2.1、哈希冲突 冲突位置,把数据构建为链表结构。 装载因子=哈希表中的元素个数 / (散列表)哈希表的长度 装载因子越大,说明链表越长,性能就越低,那么哈希表就需要扩容,把数据迁…

    Linux 2023年6月14日
    087
  • docker 安装redis

    1、获取 redis 镜像 2、查看本地镜像 bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问 protected-mode no #默认yes,开启保…

    Linux 2023年5月28日
    092
  • shell 配置文件节约空间

    shell 配置文件节约空间 sed 读取一个配置文件的的多个变量 Original: https://www.cnblogs.com/hshy/p/16451927.htmlAu…

    Linux 2023年5月28日
    084
  • PyTorch介绍-构建神经网络

    神经网络由对数据进行操作的layers/modules组成。torch.nn 命名空间提供了所有你需要的构建块,用于构建你自己的神经网络。PyTorch的每一个module都继承自…

    Linux 2023年6月14日
    095
  • 二进制安装docker

    下载二进制包 压到 /usr/local/bin ,我用的版本比较新 https://download.docker.com/linux/static/stable/x86_64/…

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