component 动态组件

Vue官网上提供了一个动态组件 <component :is="currentTabComponent"> ,那么这里的 is 到底是什么呢?

官网介绍的太分散了,这里尽量全面的列举出来。如果有遗漏欢迎补充。

  • 原生HTML
<component is="input" placeholder="原生HTML" value='123'></component>
<component is="div">这是div</component>

input、select 这些 HTML 自带的都是可以的,div这些也可以。

  • 全局组件
<component is="el-input" placeholder="UI库的文本框" style="width: 200px;" v-model='value'></component>

最常见的全局组件,就是各种UI库了,他们会用插件的方式被注册成为全局组件,所以我们可以直接使用el-input这类的标签。

  • 局部组件
<component is="test" str="局部注册的组件" ></component>

需要先在 组件的 components: { test } 部分注册组件,然后就可以用了。

  • 异步组件
<component
:is="defineAsyncComponent(()=>import('./components/test'))"
str="局部注册的组件"
></component>

这种方式就不需要在组件的 components 里面注册了,可以直接使用。可以实现真按需加载。

如何动态?

看了上面的例子你可能会奇怪,直接使用标签不香吗?干嘛非要用这个动态组件?

动态组件有几个好处:

  • 动态加载、动态改变组件类型,比如官网里的例子, 改变tab就改变了组件。

  • 遍历

<template v-for="key in [101, 102, 103, 104]" :key="key">
<component :is="dict[key]"></component>
</template>
     const dict = {
101: 'input',
102: 'el-input',
103: 'test',
104: defineAsyncComponent( () =>
import('./components/test')
)
}

这个是我最喜欢的一种用法,封装表单控件(的子控件)就非常方便了。

另外还可以实现表单的自定义子控件,比如加一个 105:你自己写的一个组件,这样就可以扩展子控件了。

属性怎么办?

不同类型的组件,需要的属性也是不一样的,那么遍历的时候如何给组件的属性赋值?

这个可以使用 v-bind="{}" 的方式来实现,把需要的属性做成一个对象就好。

事件还没想好,目前只能是统一事件。

插槽也可以支持,只是需要做一下判断。

异步组件 defineAsyncComponent

  • 加载 xx.vue 文件:
defineAsyncComponent( () =>
import('./components/test.vue')
)

我怀疑 VueRouter 就是用 defineAsyncComponent 来实现 异步路由的。

  • 加载 xx.js 文件:
defineAsyncComponent( () =>
import('./components/test.js ')
)

js文件的内容可以是这样的。

test.js

export default {
name: 'component-test',
template: `
<div>
<br>
这是 组件测试<br>
父组件传递参数:{{str}}<br>
setup 获取参数:{{str1}}<br>
</div>
`,
props: {
str: String
},
setup(props) {
// 在setup里面获取参数值
let str1 = Vue.ref(props.str)
str1.value += '--内部改一下。' return {
str1
}
}
}

我的在线演示用的都是这种方式,用来做演示还是很方便的。

  • template

    模板,设置HTML部分。

其他的地方和 .vue 文件是一样的,当然css除外,还没想出了怎么解决css 的问题,因为不会。。。

Vue组件(35)动态组件 component 的 is 到底可以是啥?的更多相关文章

  1. Vue.js的动态组件模板

    组件并不总是具有相同的结构.有时需要管理许多不同的状态.异步执行此操作会很有帮助. 实例: 组件模板某些网页中用于多个位置,例如通知,注释和附件.让我们来一起看一下评论,看一下我表达的意思是什么.评论 ...

  2. Vue两种组件类型介绍:递归组件和动态组件

    一递归组件 递归组件的特性就是可以在自己的template模板中调用自己本身.值得注意的它必须设置name属性. // 递归组件 recursive.vue <template> < ...

  3. [Vue]组件——实现动态组件:keep-alive的使用

    1.在app.vue中用一个 <keep-alive> 元素将其动态组件包裹起来: keepAlive为true时,第一次被创建的时候缓存下来,为false时,不会缓存 <keep- ...

  4. Vue 组件4 动态组件

    动态组件 通过使用保留的<component>元素,动态的绑定到它的is特性,我们让多个组件同时使用同一个挂载点,并动态切换: var vm = new Vue({ el: '#examp ...

  5. Vue组件的操作-自定义组件,动态组件,递归组件

    作者 | Jeskson 来源 | 达达前端小酒馆 v-model双向绑定 创建双向数据绑定,v-model指令用来在input,select,checkbox,radio等表单控件.v-model指 ...

  6. Vue.js的组件(slot/动态组件等)、单文件组件、递归组件使用

    一.组件 1> 组件命名方式有两种(注意:在DOM模板中只有kebab-case命名方法才生效): html中引用组件: <!-- 在DOM模板中,只有 kebab-case命名才生效 - ...

  7. Vue基础之 动态组件

    为什么会有动态组件> vue 通过组件机制 实现的页面功能的模块化处理,通常情况下 我们在vue中使用组件  就是先定义组件 然后再需要的地方 插入组件即可 但是在某些情况下 需要根据不同的需求 ...

  8. Vue_(组件通讯)动态组件结合keep-alive

    keep-alive 传送门 <keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们.和 <transition> 相似,<keep-alive ...

  9. Vue_(组件通讯)动态组件

    动态组件 传送门 在一个元素上挂载多个组件,根据不同状态进行切换的时候,可以使用动态组件 动态组件的使用:需要使用内置组件<component></component>,根据 ...

  10. Hibernate学习---第五节:普通组件和动态组件

    一.普通组件映射配置 1.创建组件类,代码如下: package learn.hibernate.bean; /** * 组件类 */ public class Phones { private St ...

随机推荐

  1. macOS 需要更新软件才能连接到 iOS 设备

    macOS 需要更新软件才能连接到 iOS 设备 更新 Mac 上的软件 如果您在 iPhone.iPad 或 iPod touch 上看到"需要更新软件才能连接到 iOS 设备" ...

  2. Azure & FaaS in Action

    Azure & FaaS in Action VSCode & Azure azure tenant select subscription Cloud Shell https://a ...

  3. Dart: 编码和解码各种存档和压缩格式

    path archive import 'dart:io'; import 'package:path/path.dart' as p; import 'package:path/path.dart' ...

  4. subline3 如何设置es6高亮

    步骤: 1.操作Ctrl+Shift+P , 然后在弹出的框内输入Package Control: in,2.选择Package Control: install package,3.等待再次弹出输入 ...

  5. 类属性和__init__的实例属性有何区别?进来了解一下吧

    真的是随笔写的一篇,以防日后记忆模糊,特此记录.大佬勿喷 疑问:类属性和实例属性有何区别? 正题,代码如下 age为People类的属性(称为类属性) name是在__init__方法下,在创建实例对 ...

  6. django学习-16.返回给前端页面数据为json数据类型的3种方案

    目录结构 1.前言 2.JsonResponse类的源码简单分析 2.1.JsonResponse类的源码如下所示 2.2.JsonResponse类的构造函数里的每个入参的大概含义和作用 3.[方案 ...

  7. Baidu Apollo use: command " rosbag " not fonud

    https://github.com/ApolloAuto/apollo/issues/181 1.If using dev docker env, you need run apollo.sh bu ...

  8. 图像仿射变换——MatLab代码实现

    这里先说一下我们的目的,最近在用Pix2Pix 做一个项目的时候,遇到了成对图像质量差,存在着特征不能对齐的问题,即A图与B图是一组成对图像,我们想要将A 图中的物体转化为B 图中的物体,但这个物体在 ...

  9. MFC多文档程序启动无子窗口的实现

    刚学MFC的我们,肯定会从一个基本MFC程序开始. 而VC++6.0的MFC基础类提供了三种创建方式:单文档.多文档.对话框. 当我们创建多文档应用程序的时候,会自动启动一个子窗口. 在我们平时使用软 ...

  10. oracle中关键字的执行顺序

    执行顺序: from where group by having select order by ******当having/select 中出现组函数,那么其他没有被组函数修饰的列就必须出现下gro ...