Vue3 用户体验的增长:异步组件与 Suspense 组件

做者:Matt Maribojoc
译者:前端小智
来源:stackabuse

有梦想,有干货,微信搜索 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。css

本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及个人系列文章。html

懒加载组件是一种改善应用程序用户体验的简便方法,尤为是在咱们的代码包很大或用户链接速度较慢的状况下。前端

Vue3引入了一些新功能,可经过改进异步组件API和新的Suspense组件来帮助咱们实现友好的用户体验。vue

用户访问应用程序时,无需当即加载UI的某些部分,例如,诸如模态框和工具提示之类的动态UI功能。此外,若是咱们使用的是单页面应用程序体系结构,则页面上的内容 看不见的页面也不该加载,直到须要为止。git

示例

在此示例应用程序中,咱们的应用程序显示一个ChatWindow组件,若是用户通过身份验证,该组件将加载。github

咱们假设只能在运行时肯定身份验证,而且该组件很大。 因为这些缘由,咱们须要要懒加载它。面试

<template>
  <h3>Chat with friends here</h3>
  <chat-window v-if="auth" />
</template>
<script>
import ChatWindow from "@/components/ChatWindow";

export default {
  components: {
    ChatWindow
  },
  ...
}
</script>

使用Vue3异步组件API进行懒加载

Vue 3引入了defineAsyncComponent API,因此实现懒加载组件是很是简单的。api

defineAsyncComponent 能够接受一个返回 Promise 的工厂函数。Promise 的 resolve 回调应该在服务端返回组件定义后被调用。你也能够调用 reject(reason) 来表示加载失败。微信

<script>
import { defineAsyncComponent } from "vue";

const ChatWindow = defineAsyncComponent(
  () => import("@/components/ChatWindow")
);

export default {
  components: {
    ChatWindow
  },
  ...
}
</script>

构建后,任何动态导入的组件都会做为一个单独的文件。app

File                                 Size

dist/js/chunk-vendors.f11402df.js    82.39 KiB
dist/js/app.ada103fb.js              20.59 KiB
dist/js/ChatWindow.3c1708e4.js       5.47 KiB
dist/css/app.8221c481.css            1.76 KiB
dist/css/ChatWindow.f16731cd.css     2.75 KiB

loading-state 内容

懒加载的缺点是须要团队交流,屡次请求形成渲染良莠不齐。处理此问题的一种方法加载组件时显示 loading-state组件。

以下图所示,组件在加载时,咱们显示一个 loading 画面,加载后在显示加载的组件内容。

image.png

defineAsyncComponent 能够接受一个对象:其中有个 loadingComponent 属性,表示加载异步组件时要使用的组件。

<script>
import { defineAsyncComponent } from "vue";
import Spinner from "@/components/Spinner.vue";

const ChatWindow = defineAsyncComponent({
  loader: () => import("@/components/ChatWindow"),
  loadingComponent: Spinner
});

export default {
  components: {
    ChatWindow
  },
  ...
}
</script>

与 Suspense 一块儿使用

上面使用loading-state的方法效果是挺好的,但有一点限制。 例如,咱们可能但愿将prop传递到加载状态组件,将内容传递到其插槽等,而使用异步组件API则不容易实现。

为了增长灵活性,咱们可使用Vue3中新出Suspense组件。这使咱们可以使用插槽肯定模板级别的异步加载内容。

Suspense 是全局组件(例如transition),能够在Vue 3应用程序中的任何位置使用。 要使用它,须要在模板中声明它,并包括两个命名的插槽:defaultfallback

Suspense 会确保在加载异步内容时显示默认插槽,并将fallback 插槽用做加载状态。

<template>
  <Suspense>
    <template #default>
      <h3>Chat with friends here</h3>
      <chat-window />
    </template>
    <template #fallback>
      <spinner color="blue" />
    </template>
  </Suspense>
</template>
<script>
import { defineAsyncComponent } from "vue";
import Spinner from "@/components/Spinner.vue";

const ChatWindow = defineAsyncComponent(
  () => import("@/components/ChatWindow")
);

export default {
  components: {
    ChatWindow,
    Spinner
  },
  ...
}
</script>

异步组件在默认状况下是可挂起的。这意味着若是它在父链中有一个 <Suspense>,它将被视为该 <Suspense> 的异步依赖。在这种状况下,加载状态将由 <Suspense> 控制,组件自身的加载、错误、延迟和超时选项都将被忽略。

异步组件能够选择退出 Suspense 控制,并能够在其选项中指定 suspensible:false,让组件始终控制本身的加载状态。

你能够在 API 参考查看更多可用的选项。

~完,我是小智,去SPA了,下期见!


代码部署后可能存在的BUG无法实时知道,过后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给你们推荐一个好用的BUG监控工具 Fundebug

原文:https://vuejsdevers.com/2020/...

交流

有梦想,有干货,微信搜索 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。

本文 GitHub https://github.com/qq44924588... 已收录,有一线大厂面试完整考点、资料以及个人系列文章。

相关文章
相关标签/搜索