vue3笔记案例——Suspense使用之骨架屏

skeleton组件

示例图
在这里插入图片描述
代码

<template>
  <div class="sk">
    <div class="sk-2">
      <div class="sk-2-1"></div>
      <div></div>
    </div>
    <hr>
    <div class="sk-3"></div>
    <div class="sk-3"></div>
  </div>
</template>

<script setup lang='ts'></script>

<style lang='less' scoped>
@bgColor: #eee;
@conColor: #ccc;

.sk {
  background-color: @bgColor;
  padding: 20px;
  .sk-2 {
    display: inline-flex;
    align-items: center;
    margin: 10px 0;
    height: 50px;
    .sk-2-1 {
      height: inherit;
      width: 50px;
      margin-right: 1rem;
      border-radius: 50%;
      background-color: @conColor;
    }
    div:last-child {
      width: 60px;
      height: 20px;
      background-color: @conColor;
    }
  }
  .sk-3 {
    margin-top: 10px;
    width: 100%;
    height: 30px;
    background-color: @conColor;
  }
}
</style>
sync组件

示例图

代码

<template>
  <div class="sk">
    <div class="sk-2">
      <div class="sk-2-1"><img :src="data.url"></div>
      <div><span>{{ data.name }}</span>&nbsp;<span>{{ data.age }}</span></div>
    </div>
    <hr>
    <div class="sk-3">{{ data.desc }}</div>
  </div>
</template>

<script setup lang='ts'>
import { axios } from '@/server/axios'

interface Data {
  data: {
    name: string
    url: string
    age: number
    desc: string
  }
}

const { data } = await axios.get<Data>('./data.json')

</script>

<style lang='less' scoped>

.sk {
  padding: 20px;

  .sk-2 {
    display: inline-flex;
    align-items: center;
    margin: 10px 0;
    height: 50px;

    .sk-2-1 {
      height: inherit;
      width: 50px;
      margin-right: 1rem;
      border-radius: 50%;

      img {
        width: 100%;
        height: 100%;
        border-radius: 50%;
      }
    }

    div:last-child {
      width: 60px;
      height: 20px;
    }
  }

  .sk-3 {
    margin-top: 10px;
    width: 100%;
    height: 30px;
    line-height: 30px;
  }
}
</style>
// axios.ts
export const axios = {
  get <T>(url:string):Promise<T> {
    return new Promise((resolve, reject) => {
      const xhr = new XMLHttpRequest()
      xhr.open("GET", url)

      xhr.onreadystatechange = () => {
        if(xhr.readyState == 4 && xhr.status == 200) {
          // 增加加载时间
          setTimeout(()=>{
            resolve(JSON.parse(xhr.responseText))
          },2000)
        }
      }
      xhr.send(null)
    })
  }
}

data.json 放在 public 文件夹下不会被编译且可以直接被访问到
在这里插入图片描述

Suspense使用

示例图
在这里插入图片描述
代码

<template>
  <Suspense>
    <!-- 具有深层异步依赖的组件 -->
    <Sync />
    <!-- 在 #fallback 插槽 -->
    <template #fallback>
      <Skeleton />
    </template>
  </Suspense>
</template>

<script setup lang="ts">
import { defineAsyncComponent } from 'vue'
import Skeleton from '@/components/skeleton.vue';
// import Sync from '@/components/sync.vue';

const Sync = defineAsyncComponent(()=> import('@/components/sync.vue'))

</script>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凡小多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值