vue3的动态组件是如何工作的

yizhihongxing

Vue3 的动态组件相比于 Vue2 有了较大的改变,本文将详细讲解 Vue3 的动态组件是如何工作的,包括其实现原理和示例说明。


什么是动态组件

Vue 中的组件是指可复用并具有独立功能的代码块,根据其作用域及其之间的交互可以实现复杂的组件化应用。而动态组件,顾名思义指在运行时可以动态地切换所渲染的组件。

Vue3 中动态组件的实现原理

在 Vue2 中,动态组件使用的是 keep-alive 组件,但是 Vue3 中这种方式已经被废除。现在 Vue3 中实现动态组件的方式主要依赖于 defineAsyncComponentTeleport 组件。

1. defineAsyncComponent

defineAsyncComponent 是 Vue3 中的新 API,当注册一个异步组件时就会返回一个符合标准的 Vue 组件定义对象,这个对象包含了 setup 函数和 render 函数。当使用这个异步组件时,Vue3 会自动运行 setup 函数来执行数据的初始化,然后再运行 render 函数来渲染组件。

2. Teleport 组件

Teleport 是 Vue3 中新引入的一个组件,它可以在外部渲染组件并将其插入到目标组件中。Teleport 组件中有两个可选属性:todisabled

其中,to 属性的值代表了目标组件,在目标组件中需要使用一个与 to 相同的 Teleport 组件来接收插入的组件,同时这个接收组件需要使用 slot 来接收即将插入的组件;disabled 属性表示是否开启 Teleport 插入。

Vue3 中动态组件的示例

  • 示例一:异步动态组件
<template>
  <div>
    <h3>这是异步动态组件的示例</h3>
    <button @click="toggleComponent">切换异步组件</button>
    <teleport to="body">
      <Suspense v-if="showComponent" >
        <MyAsyncComponent />
      </Suspense>
    </teleport>
  </div>
</template>

<script>
import { defineAsyncComponent, Suspense } from 'vue'

// 使用 defineAsyncComponent 声明一个异步组件
const MyAsyncComponent = defineAsyncComponent(() =>
  import('./MyAsyncComponent.vue')
)

export default {
  components: {
    MyAsyncComponent,
  },
  data() {
    return {
      showComponent: false,
    }
  },
  methods: {
    toggleComponent() {
      this.showComponent = !this.showComponent
    },
  },
}
</script>

在上面的示例中,我们使用 defineAsyncComponent 声明了一个异步组件 MyAsyncComponent,当点击按钮时,通过开关 showComponent 属性来切换显示和隐藏组件。

使用 teleportSuspense 组件来异步加载并渲染该组件,teleport 组件的 to 属性值为 body,表示需要将异步组件插入到页面的 body 元素中。

  • 示例二:多个异步组件动态加载
<template>
  <div>
    <h3>这是多个异步组件动态加载的示例</h3>
    <div>
      <button @click="changeComponent(1)">切换异步组件1</button>
      <button @click="changeComponent(2)">切换异步组件2</button>
      <button @click="changeComponent(3)">切换异步组件3</button>
    </div>
    <teleport to="body">
      <template v-if="currentComponent">
        <suspense :fallback="loading"> 
          <component :is="currentComponent" />
        </suspense>
      </template>
    </teleport>
  </div>
</template>

<script>
import { defineAsyncComponent, Suspense, ref } from 'vue'

// 异步组件
const AsyncComponent1 = defineAsyncComponent(() =>
  import('./AsyncComponent1.vue')
)
const AsyncComponent2 = defineAsyncComponent(() =>
  import('./AsyncComponent2.vue')
)
const AsyncComponent3 = defineAsyncComponent(() =>
  import('./AsyncComponent3.vue')
)

export default {
  components: {
    AsyncComponent1,
    AsyncComponent2,
    AsyncComponent3,
  },
  setup() {
    const currentComponent = ref(null)
    const loading = ref('loading')
    const changeComponent = (type) => {
      switch (type) {
        case 1:
          currentComponent.value = 'AsyncComponent1'
          break
        case 2:
          currentComponent.value = 'AsyncComponent2'
          break
        case 3:
          currentComponent.value = 'AsyncComponent3'
          break
      }
    }
    return {
      currentComponent,
      loading,
      changeComponent,
    }
  },
}
</script>

在上述示例中,我们定义了三个异步组件 AsyncComponent1AsyncComponent2AsyncComponent3,并在页面上使用按钮根据需要来切换显示哪个异步组件。

template 标签以 v-if 条件分支的方式为最终显示的组件添加了一个 suspense 组件,并通过 currentComponent 属性值为各个不同的异步组件名称来动态渲染不同的异步组件,当组件加载完成之前,该组件的占位符为 loading

总结

在 Vue3 中,动态组件的实现方式不再是使用 keep-alive 组件来进行组件缓存,而是通过 defineAsyncComponentTeleport 组件来进行动态加载和插入组件,这样做使代码更加简洁且易于理解。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue3的动态组件是如何工作的 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 解决vue A对象赋值给B对象,修改B属性会影响到A的问题

    当将 A 对象赋值给 B 对象后,实际上只是将 B 对象指向了 A 对象在内存中的地址,而并不是新创建了一个对象。因此修改 B 对象的属性会影响到 A 对象的属性。为了解决这个问题,我们可以使用深拷贝或浅拷贝的方式来创建一个新的对象,从而避免修改一个对象的属性影响到另一个对象的属性。 以下是两条示例: 示例 1 let A = { name: ‘Tom’, …

    Vue 2023年5月28日
    00
  • Vue 简单实现前端权限控制的示例

    针对 “Vue 简单实现前端权限控制的示例” 的完整攻略,我将分为以下几个部分进行详细的讲解: 前期准备 实现权限控制的方式 示例说明 前期准备 在进行权限控制的实现之前,我们需要提前做好以下几点准备: 熟悉 Vue 的基础语法和组件开发模式 新建一个项目并安装相关依赖,如 vue-router、axios 等 实现权限控制的方式 方式一:路由权限控制 Vu…

    Vue 2023年5月28日
    00
  • 微信小程序wepy框架笔记小结

    微信小程序wepy框架笔记小结 什么是wepy框架 wepy是一个类Vue框架的微信小程序框架,它封装了很多常见的操作,方便我们快速开发小程序,同时还支持组件化开发。 wepy框架的优点 代码结构清晰明了,易于维护 支持组件化开发,方便复用 支持ES6/7标准语法,提高开发效率 自带脚手架,快速初始化项目 wepy框架的基本使用 安装wepy npm ins…

    Vue 2023年5月27日
    00
  • node.js从前端到全栈的必经之路

    Node.js从前端到全栈的必经之路 在现代Web开发中,Node.js技术越来越重要,它作为一个轻量级的解决方案,可以帮助前端开发者从一个只能生产HTML、CSS和JavaScript的Web开发者,逐步变成一个能够为整个Web应用程序提供优质服务的全栈开发者。以下是一个从前端到全栈的Node.js学习路线和攻略: 1. 初步认识Node.js Node.…

    Vue 2023年5月28日
    00
  • Vue.js每天必学之内部响应式原理探究

    Vue.js每天必学之内部响应式原理探究 前言 Vue.js是一款前端框架,拥有许多优秀的特性,如组件化、响应式等,其中响应式即是Vue.js最为核心的部分之一。本文主要讲解Vue.js的响应式原理、数据双向绑定、getter与setter等内容。 Vue.js响应式原理 Vue.js的响应式原理包含以下步骤:1. 创建一个Vue实例。2. 在Vue实例中设…

    Vue 2023年5月28日
    00
  • Vuex中的State使用介绍

    当我们使用 Vue 开发复杂的应用程序时,我们通常会遇到许多组件共享相同的状态数据的情况。在这种情况下,每个组件都必须知道如何获取和操作此数据,这会导致代码的冗余以及困难的维护性。Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。 在 Vuex 中,可以以集中化的方式处理共享状态。该模式包括四个核心概念: state: 管理整个应用程序的状态 …

    Vue 2023年5月28日
    00
  • Vue.js展示AJAX数据简单示例讲解

    下面我将为你讲解如何在Vue.js中展示AJAX数据的完整攻略。 1. 起步 首先,我们需要安装npm包管理器,并使用它来安装Vue.js: npm install vue 安装完成后,在HTML文件中引入Vue.js: <script src="https://cdn.jsdelivr.net/npm/vue"></s…

    Vue 2023年5月28日
    00
  • vue3组合式api实现v-lazy图片懒加载的方法实例

    下面我来详细讲解一下“vue3组合式api实现v-lazy图片懒加载的方法实例”的完整攻略。 1. 初步了解Vue3中的组合式API 在Vue3中,使用组合式API可以更加灵活地组织逻辑代码,将逻辑代码与UI组件的逻辑分离,使得组件更加清晰、易于维护。组合式API中重要的概念有:响应式数据、ref、reactive、setup等。 在使用组合式API时,需要…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部