vue3动态组件使用详解

yizhihongxing
  1. 什么是动态组件

Vue 3 中的动态组件是一种非常方便的技巧,可以根据需要动态选择并呈现组件。实现动态组件可以通过标签的 is 特性来实现。例如,假设我们有这样一个父组件:

<template>
  <div>
    <component :is="currentComponent"></component>
  </div>
</template>

在上面的组件中,我们使用子组件中的 is 属性,以动态的方式选择呈现给用户的组件,而 currentComponent 可以是一个计算属性,它根据业务逻辑来动态返回组件的名称。

  1. 自定义组件

Vue 3 的组件是非常强大的工具,当然也包括动态组件。我们可以为自定义组件创建相应的动态组件。比如有以下组件:

<template>
  <h4>{{ title }}</h4>
</template>

<script>
  export default {
    props: {
      title: String
    }
  }
</script>

我们可以为这个组件创建一个动态组件,例如:

<component :is="currentComponent" :title="title"></component>

currentComponent 可以动态地引用我们自定义的组件:

data() {
  return {
    currentComponent: 'MyComponent',
    title: '这是一个标题'
  }
},

components: {
  MyComponent: () => import('./MyComponent.vue')
}

在上面的代码中,我们动态设置了 currentComponent,以动态使用并渲染组件。

示例1

比如我们有一个父组件,父组件可以动态选择呈现 HelloWorld 组件和 WorldHello 组件,示例代码如下:

<template>
  <div>
    <select v-model="currentComponent">
      <option value="HelloWorld">HelloWorld</option>
      <option value="WorldHello">WorldHello</option>
    </select>
    <component :is="currentComponent"></component>
  </div>
</template>

<script>
  import HelloWorld from './components/HelloWorld.vue'
  import WorldHello from './components/WorldHello.vue'

  export default {
    components: {
      HelloWorld,
      WorldHello
    },

    data() {
      return {
        currentComponent: 'HelloWorld'
      }
    }
  }
</script>

在这个例子中,我们首先通过一个 select 列表来选择需要呈现的子组件,然后使用动态组件来呈现。在这个例子中,我们将 HelloWorld 组件和 WorldHello 组件作为一个组件数组传递给父组件,然后使用 is 属性动态地呈现这两个组件中的一个。

示例2

我们可以通过 $options 给组件动态设置 props。示例代码如下:

<template>
  <div>
    <button @click="switchComponent">Switch</button>
    <component :is="currentComponent" :message="message"></component>
  </div>
</template>

<script>
  import ComponentA from '../components/ComponentA.vue'
  import ComponentB from '../components/ComponentB.vue'

  export default {
    components: {
      ComponentA,
      ComponentB
    },

    data() {
      return {
        currentComponent: 'ComponentA',
        message: 'Hello World!'
      }
    },

    methods: {
      switchComponent() {
        if (this.currentComponent === 'ComponentA') {
          this.currentComponent = 'ComponentB'
          this.$options.components.ComponentB.props = {
            message: {
              type: String,
              default: 'Hello World!'
            }
          }
        } else {
          this.currentComponent = 'ComponentA'
          this.$options.components.ComponentA.props = {
            message: {
              type: String,
              default: 'Hello World!'
            }
          }
        }
      }
    }
  }
</script>

在这个例子中,我们有两个组件:ComponentA 和 ComponentB,它们都有一个名为 message 的 prop。我们可以使用当前所选组件的 props 来动态更改 message。当用户点击“切换”按钮时,位于 is 属性中的当前组件被切换,它的 props 也会切换。如果当前组件是 ComponentA,则它的 props 将更改为:

this.$options.components.ComponentA.props = {
  message: {
    type: String,
    default: 'Hello World!'
  }
}

同样,如果当前组件是 ComponentB,则它的 props 将更改为:

this.$options.components.ComponentB.props = {
  message: {
    type: String,
    default: 'Hello World!'
  }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue3动态组件使用详解 - Python技术站

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

相关文章

  • vue中展示、读取.md 文件的方法(批量引入、自定义代码块高亮样式)

    展示和读取 markdown 文件在 Vue 中是一个常见的需求,Vue 框架提供了一些库和插件来满足这种需求。以下是在 Vue 中展示、读取 markdown 文件的方法以及如何实现自定义代码块高亮样式的完整攻略: 读取 Markdown 文件 在 Vue 中读取 Markdown 文件可以使用 markdown-it 库。该库可以将 Markdown 文…

    Vue 2023年5月28日
    00
  • 详解vue axios二次封装

    下面是“详解vue axios二次封装”的完整攻略。 一、为什么需要封装axios? 在Vue应用中发起网络请求,一般会选择使用axios库。因为axios具有一系列强大的功能,比如:支持Promise,支持取消请求,拦截请求和响应,自动转换JSON格式等。但是,如果我们直接使用axios,会有一些不方便的地方,比如:每个请求都需要设置baseUrl、每个请…

    Vue 2023年5月28日
    00
  • 详解Vue 开发模式下跨域问题

    以下是详解Vue开发模式下跨域问题的完整攻略: 背景 在Vue项目中,我们经常需要与后端API进行交互。但是由于浏览器的安全策略,不同域名之间的接口调用为所禁止。这就涉及到了跨域问题。 解决方案 方案一:使用代理 在开发中,我们可以使用代理将HTTP 请求转发到API服务器,这样就可以避免跨域问题。以下是使用Vue CLI提供的代理功能的示例: // vue…

    Vue 2023年5月28日
    00
  • 解决vue init webpack 下载依赖卡住不动的问题

    当使用vue-cli的模板生成器vue init webpack脚手架时,有时在安装依赖包的时候会卡在某个包上不动,导致整个过程无法继续。这种情况可能是由于网络问题、依赖版本冲突等多种原因造成的,以至于我们无法轻易判断出原因。但是,我们可以有一些解决办法来尝试解决这个问题。 下面是解决vue init webpack下载依赖卡住不动的问题的完整攻略: 1.更…

    Vue 2023年5月27日
    00
  • 手把手教你搭建一个vue项目的完整步骤

    下面是搭建Vue项目的完整步骤: 1. 创建Vue项目 创建Vue项目有多种方式,这里我们以 Vue CLI 为例。先确保已经安装了 Node.js,然后执行命令: npm install -g @vue/cli 安装成功后,使用 vue create 命令创建项目: vue create my-project 根据提示选择一些基本配置,然后等待安装完成即可…

    Vue 2023年5月28日
    00
  • vue中的vue-router query方式和params方式详解

    Vue中的Vue-Router query方式和params方式详解 前言 在线路切换时,Vue提供了Vue-Router作为前端路由。 Vue-Router更好地配合Vue完成SPA(单页应用)的构造,相信很多使用过Vue-cli的开发者都踩过Vue-Router的坑。 本文将详细介绍Vue-Router的query方式和params方式作为前端路由传参。…

    Vue 2023年5月27日
    00
  • vue3 使用setup语法糖实现分类管理功能

    让我来详细讲解一下“vue3 使用setup语法糖实现分类管理功能”的完整攻略。 1. 环境准备 首先,我们需要完成一些准备工作: 安装最新版本的Vue CLI命令行工具 配置VSCode的插件Vetur,以获得更好的vue代码编辑体验 创建一个新的vue3项目。 2. 配置路由 在Vue项目中,我们需要先配置路由,才能实现不同页面之间的跳转。我们使用Vue…

    Vue 2023年5月27日
    00
  • 使用vue插件axios传数据的Content-Type及格式问题详解

    使用Vue插件axios传送数据时,我们需要了解有关Content-Type的知识。Content-Type是HTTP头部中的一个域,表示发送数据的媒体类型和字符集。在传送数据时,我们需要根据接受方所期望的Content-Type的类型,构造对应的数据格式来传输数据。 简单来说,如果请求的Content-Type为‘application/json’, 则P…

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