第十章:动态组件,插槽,自定义指令

网友投稿 737 2022-11-26

第十章:动态组件,插槽,自定义指令

第十章:动态组件,插槽,自定义指令

第十章:动态组件,插槽,自定义指令

本章任务

动态组件插槽自定义指令vant UI 组件库axios的配置

本章内容

动态组件自定义指令

一、动态组件

1.1 什么是动态组件

概念:动态组件就是可以动态改变的组件,之前我们引入组件,都是把组件固定写在某一个位置显示,没有办法切换组件显示,动态组件可以帮我们完成这个目的。vue中提供了一个组件​​​​来动态的完成组件的切换, 不需要我们自己去封装。

1.2 动态组件的使用

父组件中导入并注册子组件

//导入需要动态切换的 两个子组件 import com01 from '../components/Com01.vue' import com02 from '../components/Com02.vue' export default{ name:"about", //注册子组件 components:{ com01,com02 }, }

在父组件中通过​​​​内置组件的:is属性,使用子组件

直接写is相当于直接写死 一个组件的名称,可以使用v-bind 的:is属性来完成动态的组件切换效果。

存在问题: 此时虽然可以动态切换组件,但是存在问题,组件的切换其实就是组件的销毁并重新创建,此时会导致再次切换回来无法保证原来的组件中的数据信息。可以通过生命周期函数验证。

com01.vue组件:

com02.vue组件:

about.vue父组件:

1.3 使用 keep-alive 解决上述问题

keep-alive可以保证在组件切换时 不被销毁,处于缓存状态,从而保证数据的完整性。

代码实现:使用​​​​​把​​​​包括起来就可以了。

1.4 ​​keep-alive​​的生命周期函数和属性props

1.4.1 生命周期函数

​​keep-alive​​缓存组件有两个生命周期钩子函数,分别是:

​​activated​​ 组件被激活时调用​​deactivated​​ 组件被缓存时调用

1.4.2 ​​keep-alive​​属性

​​include​​ - 字符串或正则表达式。只有名称匹配的组件会被缓存。​​exclude​​ - 字符串或正则表达式。任何名称匹配的组件都不会被缓存。​​max​​ - 数字。最多可以缓存多少组件实例。最多可以缓存多少组件实例。一旦这个数字达到了,在新实例被创建之前,已缓存组件中最久没有被访问的实例会被销毁掉。

**注意:**include和exclude两个属性不能同时使用。

二、插槽 slot

2.1 slot简介 v-slot

slot是插槽(槽口)的意思,其目的在于让组件的 可扩展性 更强,用来混合父组件的内容与子组件自己的模板

#例如:需要在组件中插入一些内容 Something bad happened. ul li#定义组件模版时Vue.component('alert-box', { template:'#ab'})

2.2 使用场景和分类

在组件化开发中,虽然组件是一样的,但是在不同的使用场景组件的一部分内容需要有不同的内容显示

2.2.1 分类

匿名slot具名slot

2.2.2 匿名插槽

匿名插槽:从字面意思来理解是就是没有名字的插槽,特点就是可以放任何你放的东西。

**注意:**此时的插槽不是真的没有名字,而是名字默认为 ‘default’ ====> ​​​​

可以防止任何内容

2.2.3 具名插槽

假设我们的电脑主板上的各种插槽,有插CPU的,有插显卡的,有插内存的,有插硬盘的,所以假设有个组件是computer,我们不可能把显卡插到内存的位置上,具名slot也就是每个slot都有名字,不能随意替换,对应插入

vue2.6之前的版本:

  • 第1个li标签
  • 第2个li标签
  • 第3个li标签
  • 你好嘿嘿额1
  • 你好嘿嘿额2
在组件模板中定义slot有名字的插槽 但是在使用时 也要带上插槽的名字。 vue2.6之后的版本:

A paragraph for the main content.

And another one.

v-slot的简写形式就是#

2.2.4 作用域插槽:借助插槽的子组件向父组件传值:

**场景:**子组件的数据需要到父组件,父组件使用子组件的数据进行一些列运算 再发送给子组件。

如果使用父子组件的通信:需要借助 自定义事件监听,props[]做数据传递,麻烦。

此时可以使用插槽来实现 子向父 再到 父向子做数据传递。

#com01.vue子组件中#About.vue父组件中观察发现,在com01.vue子组件中的插槽内 定义了属性msg='你好哈哈哈',在about.vue父组件中的