Vue--》动态组件和插槽的使用讲解

时间:2022-12-07 08:05:56

Vue--》动态组件和插槽的使用讲解

目录

动态组件

keep-alive使用

keep-alive的include和exclude属性

插槽


动态组件

动态组件指的是动态切换组件的显示与隐藏,vue提供了一个内置的<component>组件,专门用来实现动态组件的渲染。什么意思呢?接着往下看:

Vue--》动态组件和插槽的使用讲解

那么内置的<component>组件是什么情况呢?component 是可以作为标签使用的,其作用组件的占位符。当然其作为标签直接使用是会报错的,还需要搭配属性值 is其表示要渲染的组件的名字。如下:

Vue--》动态组件和插槽的使用讲解

那么如何去动态的切换组件呢?写一个简单的button按钮实现即可,如下:

Vue--》动态组件和插槽的使用讲解

Vue--》动态组件和插槽的使用讲解

keep-alive使用

当我们动态的去创建组件时,这一点和 v-if 很相似,改变组件会直接将改变之前的组件的数据销毁掉。如下:

我们给Left组件设置 +1 按钮,来表示其数据:

Vue--》动态组件和插槽的使用讲解

用生命周期函数来监听组件的创建和销毁:

Vue--》动态组件和插槽的使用讲解

Vue--》动态组件和插槽的使用讲解

那我们如何在动态创建组件的同时还能暴露组件之前的数据呢?这里就需要借助keep-alive。

Vue--》动态组件和插槽的使用讲解

Vue--》动态组件和插槽的使用讲解

keep-alive对应的生命周期函数

当组件被缓存时,会自动触发组件的deactivated生命周期函数。

当组件被激活时,会自动触发组件的activated生命周期函数。

created(){
    console.log('Left组件被"创建"了');
},
destroyed(){
    console.log('Left组件被"销毁"了');
},

// 当组件第一次被创建的时候,既会创建created生命周期,也会执行activated生命周期
// 当组件被激活时,只会触发activated生命周期,不再触发created。因为组件没有被重新创建
activated(){
    console.log('组件被激活了,activated');
},
deactivated() {
    console.log('组件被缓存了,deactivated');
},

Vue--》动态组件和插槽的使用讲解

keep-alive的include和exclude属性

include属性用来指定:只有名称匹配的组件会被缓存。多个组件名之间使用英文的逗号分隔:

exclude属性用来指定:只有名称匹配的组件“不“会被缓存。多个组件名之间使用英文的逗号分隔:

Vue--》动态组件和插槽的使用讲解

插槽

插槽Slot)是 vue 为组件的封装者提供的能力。允许开发者在封装组件时,把不确定的、希望由用户指定的部分定义为插槽。其操作如下:

Vue--》动态组件和插槽的使用讲解

vue官方规定:每一个slot插槽,都要有一个name名称,如果省略了slot的name属性,则有一个默认名称叫做 default ,默认情况下,在使用组件的时候,提供的内容都会被填充到名字为default的插槽之中。

如果要把内容填充到指定名称的插槽中,需要使用 v-slot:这个指令,v-slot:后面要跟上插槽的名字,注意:v-slot:指令不能直接用在元素身上,必须用在template标签上。当然这个指令也是有简写形式:# 即可。template:这个标签是一个虚拟标签,只其到包裹性质的作用,不会被渲染为任何实质性的 html 元素。

Vue--》动态组件和插槽的使用讲解

Vue--》动态组件和插槽的使用讲解

后备内容:封装组件时,可以为预留的<slot>插槽提供后备内容(默认内容)。如果组件的使用者没有为插槽提供任何内容,则后备内容会生效。

Vue--》动态组件和插槽的使用讲解

作用域插槽:在封装组件时,为预留的<slot>提供属性对应的值。如下:

Vue--》动态组件和插槽的使用讲解

Vue--》动态组件和插槽的使用讲解

当然上面的作用域插槽数据明显是写死了,那么可以将数据动态存储在data里面吗?答案是可以的

Vue--》动态组件和插槽的使用讲解