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

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 data不可以使用箭头函数问题

    解析vue中的data不可以使用箭头函数问题,主要是因为箭头函数没有自己的上下文,而且 Vue 中传递给 data 的对象必须是可扩展的,以便在数据更新时进行响应。下面是该问题的解决攻略: 方法1:使用传统的函数 在Vue组件中,如果要解析data对象,应该在声明周期的created或mounted函数中使用传统的函数来定义data。如下所示: <te…

    Vue 2023年5月28日
    00
  • Vue中.vue文件比main.js先执行的问题及解决

    在Vue项目中,经常会遇到.vue文件比main.js先执行的问题,并且该问题可能会导致程序运行失败或运行结果异常。下面是解决该问题的完整攻略。 问题描述 在Vue项目的main.js文件中,我们通常使用Vue框架的实例化方法来启动整个应用程序。然而,在某些情况下,我们需要在main.js文件中引入.vue文件,并且在实例化Vue应用程序之前使用该文件中的组…

    Vue 2023年5月28日
    00
  • Vue使用electron转换项目成桌面应用方法介绍

    Vue使用Electron转换项目成桌面应用方法介绍 Electron是基于Chromium和Node.js开发的流行桌面应用开发框架,它可以让你使用前端技术(如HTML、CSS和JavaScript)开发出桌面应用。而Vue是一款易用、高效的前端框架,它可以让我们快速构建响应式、可维护的Web应用程序。将二者结合起来,可以让我们更加高效地开发出高质量的桌面…

    Vue 2023年5月28日
    00
  • 解决vue elementUI中table里数字、字母、中文混合排序问题

    想要解决Vue ElementUI中的Table里数字、字母、中文混合排序问题,我们需要引入一个第三方库:pinyin。pinyin可以将汉字转换成拼音,这可以帮助我们对含有中文的字符串进行排序。 下面是解决这一问题的完整攻略: 安装pinyin 在终端中输入以下命令进行pinyin的安装: npm install pinyin –save 对Table数…

    Vue 2023年5月27日
    00
  • JS实现简单的抽奖转盘效果示例

    下面是关于“JS实现简单的抽奖转盘效果示例”的完整攻略。 1. 准备工作 首先,我们需要准备以下文件和工具: HTML 文件:作为网页展示的载体。 CSS 文件:用于美化网页样式。 JavaScript 文件:实现抽奖转盘效果的主要代码。 图片资源:包括转盘背景、奖品图标等。 2. HTML 结构搭建 在 HTML 文件中,我们需要搭建转盘的基本结构。示例如…

    Vue 2023年5月28日
    00
  • 详解Vue 的异常处理机制

    详解Vue 的异常处理机制 在Vue中,异常处理是非常重要的一项功能。当Vue应用程序遇到错误时,异常处理机制能够以可控的方式展示错误信息,帮助开发过程中更加高效、准确的定位和解决问题。本文将详解Vue的异常处理机制,以及如何在Vue应用程序中实现异常处理。 Vue 的异常处理机制 Vue中的异常处理机制主要由以下两部分组成: 1.全局错误处理器(Globa…

    Vue 2023年5月27日
    00
  • Vue源码中要const _toStr = Object.prototype.toString的原因分析

    Vue源码中要使用const _toStr = Object.prototype.toString的原因,主要是因为在JavaScript中,判断类型时使用Object.prototype.toString方法会更加准确和稳定。 具体来说,_toStr是一个常量变量,用来保存Object原型上的toString方法。常量定义为const类型,表示_toStr…

    Vue 2023年5月27日
    00
  • Vue自定义复制指令 v-copy功能的实现

    下面是“Vue自定义复制指令 v-copy功能的实现”的完整攻略: 什么是v-copy? v-copy是Vue自带的指令之一,用于将指定的值复制到剪切板中。使用v-copy可以使得复制的操作更加简单和便捷。但是,v-copy只能复制一个固定的值,如果我们想自定义复制内容,则需要自定义一个v-copy指令。 v-copy的功能实现 v-copy可以说是一个比较…

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