持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情 vue 提供了一个内置的 组件,专门用来实现动态组件的渲染。示例代码如下:
- 什么是动态组件
动态组件指的是动态切换组件的显示与隐藏。
- 如何实现动态组件渲染
2.1 点击按钮实现组件页面切换
- 使用 keep-alive 保持状态(把内部的组织进行缓存,而不是销毁组件)
默认情况下,切换动态组件时无法保持组件的状态。此时可以使用 vue 内置的 组件保持动态组件的状态。示例代码如下:
4. keep-alive 对应的生命周期函数
当组件被缓存时,会自动触发组件的 deactivated 生命周期函数。
当组件被激活时,会自动触发组件的 activated 生命周期函数。
当组件第一次被创建的时候,既会执行 created 生命周期,也会执行 activated 生命周期
但是,当组件被激活的时候,只会触发 activated 生命周期,不再触发created ,因为组件没有被重新创建
5. keep-alive 的 include 属性
include 属性用来指定:只有名称匹配的组件会被缓存。多个组件名之间使用英文的逗号分隔:
6. keep-alive的exclude属性
exclude 属性用来指定:只有名称匹配的组件不会被缓存。多个组件名之间使用英文的逗号分隔:
注意:include和exclude两个属性不要同时使用
8. 什么是插槽
插槽(Slot)是 vue 为组件的封装者提供的能力。允许开发者在封装组件时,把不确定的、希望由用户指定的
部分定义为插槽。
可以把插槽认为是组件封装期间,为用户预留的内容的占位符。
- 体验插槽的基础用法
在封装组件时,可以通过 元素定义插槽,从而为用户预留内容占位符。示例代码如下:(v-slot:default的简写为#default)
9.1 没有预留插槽的内容会被丢弃
如果在封装组件时没有预留任何 插槽,则用户提供的任何自定义内容都会被丢弃。示例代码如下
9.2 后备内容
封装组件时,可以为预留的 插槽提供后备内容(默认内容)。如果组件的使用者没有为插槽提供任何内容(指定任何内容),则后备内容会生效。如果使用者指定了插槽的name,那么优先显示指定内容,示例代码如下:
10. 具名插槽
如果在封装组件时需要预留多个插槽节点,则需要为每个 插槽指定具体的 name 名称。这种带有具体
名称的插槽叫做“具名插槽”。示例代码如下:
10.1 为具名插槽提供内容
在向具名插槽提供内容的时候,我们可以在一个
- 作用域插槽
在封装组件的过程中,可以为预留的 插槽绑定 props 数据,这种带有 props 数据的 叫做“作用
域插槽”。示例代码如下:
11.1 使用作用域插槽
可以使用 v-slot: 的形式,接收作用域插槽对外提供的数据。示例代码如下:
11.2 解构插槽 Prop
作用域插槽对外提供的数据对象,可以使用解构赋值简化数据的接收过程。示例代码如下
12. 什么是自定义指令
vue 官方提供了 v-text、v-for、v-model、v-if 等常用的指令。除此之外 vue 还允许开发者自定义指令
- 自定义指令的分类
vue 中的自定义指令分为两类,分别是:
⚫ 私有自定义指令
⚫ 全局自定义指令
- 私有自定义指令
在每个 vue 组件中,可以在 directives 节点下声明私有自定义指令。示例代码如下:bind(el){}函数是固定的
15. 使用自定义指令
在使用自定义指令时,需要加上 v- 前缀。示例代码如下:
16. 为自定义指令动态绑定参数值
在 template 结构中使用自定义指令时,可以通过等号(
=)的方式,为当前指令动态绑定参数值:
17. 通过 binding 获取指令的参数值
在声明自定义指令时,可以通过形参中的第二个参数,来接收指令的参数值
18. update 函数
bind 函数只调用 1 次:当指令第一次绑定到元素时调用,当 DOM 更新时 bind 函数不会被触发。 update 函数会在每次 DOM 更新时被调用,第一次调用时不会触发update函数,因此bind和update函数都需要写,示例代码如下:
19. 函数简写
如果 insert 和update 函数中的逻辑(代码)完全相同,则对象格式的自定义指令可以简写成函数格式
20. 全局自定义指令
全局共享的自定义指令需要通过“Vue.directive()”进行声明,示例代码如下:
21.总结
① 能够掌握 keep-alive 元素的基本使用
⚫ 标签、include 属性
② 能够掌握插槽的基本用
⚫ 标签、具名插槽、作用域插槽、后备内容
③ 能够知道如何自定义指令
⚫ 私有自定义指令 directives: { }
⚫ 全局自定义指令 Vue.directive()