Vue 生命周期
生命周期的四个阶段
Vue 生命周期:一个 Vue 实例从创建到销毁的整个过程。
组件每个阶段它的内部构造是不一样的,所以一般特定的钩子做特定的事,比如 Ajax 获取数据就可以在 mounted
阶段。
从 Vue 实例被创建开始到该实例最终被销毁的整个过程叫做 VUE 的生命周期,在这个生命周期内发生了下面的事情:从 vue 实例被创建开始,首先 vue 实例被创建,之后开始数据的初始化,编译模板,挂载 dom,渲染 dom,更新对象属性,渲染 dom,解绑销毁。
创建:const app = new Vue({ ... })
销毁:关闭页面
生命周期四个阶段:①创建 ②挂载 ③更新 ④销毁
生命周期钩子函数
Vue 生命周期过程中,会自动运行一些函数,被称为生命周期钩子,让开发者可以在特定阶段运行自己的代码。
|
|
自定义指令
基础语法
自定义指令:自己定义的指令,可以封装一些 dom 操作,扩展额外功能。
|
|
自定义指令钩子函数
钩子函数 | 描述 |
---|---|
bind | 只调用一次,在指令第一次绑定到元素时触发。可以在这里进行初始设置、绑定事件监听器等操作。 |
inserted | 在被绑定元素插入父节点时触发。如果指令绑定的元素是动态生成的,在插入后才会触发。 |
update | 在指令所在模板更新时触发,不论绑定值是否发生变化。可以通过比较更新前后的绑定值,以便在需要时执行相应的操作。 |
componentUpdated | 在被绑定元素所在模板完成一次更新周期时触发。如果需要在每次更新时执行操作,可以选择使用这个钩子函数。 |
unbind | 只调用一次,在指令与元素解绑时触发。可以在这里进行清理工作、移除事件监听器等操作。 |
常用的自定义指令生命周期函数的参数:
参数 | 说明 |
---|---|
el | 指令所绑定的元素,可以直接用于操作 dom 元素 |
binding | 一个对象,包含多个属性,用于接收属性的参数值 |
vnode | 代表绑定元素底层的虚拟节点 |
prevNode | 之前页面渲染中指令所绑定元素的虚拟节点 |
在 Vue3 中,自定义指令的钩子函数名称更改为:
- beforeMount
:代替 bind
- mounted
:代替 inserted
- beforeUpdate
:新
- updated
:代替 componentUpdated
- beforeUnmount
:新
- unmounted
:代替 unbind
钩子函数示例:
|
|
编写代码,创建自定义指令,通过自定义指令能够让文字颜色变为红色。
-
使用
directives: { 方法名: { 钩子函数: function(形参){ 执行的代码}}}
-
在标签中使用
v-方法名
调用 Vue 指令
|
|
在 vue3 中:
|
|
插槽
默认插槽
作用:让组件内部的一些结构支持自定义。
封装组件后,希望组件中的部分内容能够动态修改,可以使用插槽。

-
组件内需要定制的结构部分,改用
<slot></slot>
占位。 -
使用组件时,
<MyDialog></MyDialog>
标签内部,传入结构替换slot
。
Video
|
|
App
|
|
后背内容(默认值)
插槽后备内容:封装组件时,可以为预留的 <slot>
插槽提供后备内容(默认内容)。
语法:在 <slot>
标签内,放置内容,作为默认显示内容,如果组件标签中有内容,则默认内容不显示。
|
|
具名插槽
默认插槽只能定制一个位置的内容,如果在组件中,有多个地方需要改变内容,此时需要使用具名插槽,即具有名字的插槽,通过 name
属性为插槽命名,再进行区分。
使用方法:
-
多个
slot
使用name
属性区分名字 -
template
配合v-slot:name
来分发对应标签
插槽添加 name
属性后,就是具名插槽,只支持定向分发。此外,v-slot:name
可以简写为 #name
Video
|
|
App
|
|
作用域插槽
作用域插槽是插槽的一个传参语法。
作用域插槽:定义 slot 插槽的同时是可以传值的。给插槽上可以绑定数据,将来使用组件时可以调用。
|
|
案例:表格业务动态变化
插槽渲染的不只有数据,也有可能需要动态渲染方法的时候,此时方法无法直接调用父组件中的数据,需要使用作用域插槽进行数据传递。
|
|
需求:
① 能够根据不同数组渲染列表
② 操作分为两种:删除和修改(slot
)
③ 点击删除/修改时对数据进行操作,此时在父组件中无法使用 item.id
传值,需要使用作用域插槽
④ 为 slot
添加属性,在父组件中使用 template
标签和 #default="obj"
属性接收传值
将上方代码改为组件+插槽的形式:
Table
|
|
App
|
|
此时尝试在 App.vue
当中为 button
添加删除逻辑,如下:
|
|
在 Table.vue
当中添加删除方法,如下:
|
|
显示的报错信息为:

需要在子组件的 slot 标签中使用 v-bind
绑定属性传值,vue 会将 slot 标签中传递的值保存在一个数组当中,在父组件引用的子组件标签中使用 template+v-slot:插槽名="自定义对象"
即可将子组件中所有传递的数据存储在该对象中。
此时在父组件中即可通过 自定义对象.传递数据
的方法获取到子组件的数据,从而调用方法。
Table
|
|
App
|
|
动态组件
定义动态组件
利用动态组件可以动态切换页面中显示的组件。使用 <component>
标签可以定义动态组件,<component>
标签必须配合 is
属性一起使用,is
属性的属性值表示要渲染的组件。
在 vue3 中,使用 setup
语法糖配合 shallowRef()
函数可以将组件保存为响应式数据。shallowRef()
函数只处理对象最外层属性的响应,它比 ref()
函数更适合将组件保存为响应式数据。
App
|
|
根据元素类型动态渲染组件
|
|
实战案例
基础样式

Goods
|
|
Part
|
|
App
|
|
使用具名插槽

Goods
|
|
Part
|
|
App
|
|
v-for 循环

Goods
|
|
Part
|
|
App
|
|
插槽嵌套

Goods
|
|
Part
|
|
App
|
|
按需修改

Goods
|
|
Extra
|
|
Part
|
|
App
|
|
练习
-
可以通过()标签为组件添加插槽?
-
如果要把内容填充到指定名称的插槽中,可以通过一个包含()指令的
<template>
标签来实现。 -
如果一个组件没有预留任何插槽,则组件的使用者提供的任何插槽内容同样会起作用。()
-
添加 name 属性的
<slot>
标签用来定义具名插槽。() -
dom 元素在哪个生命周期后才能后被调用?
A. onActived() B. mounted() C. beforeCreate() D. beforeMount()
- 下列说法,关于自定义指令说法错误的是。()
A. 插槽是组件封装期间为组件的使用者预留的占位符。
B. 在定义插槽时,直接写一个 <slot>
标签,它属于默认插槽。
C. 如果组件的使用者为插槽提供内容,则默认内容生效。
D. 当需要使用多个插槽时,则需要为每个 <slot>
插槽指定具体的 name 属性。
- 下列选项中,关于自定义指令说法错误的是。()
A. 全局自定义指令可以在全局进行使用。
B. 私有自定义指令只能够在声明该指令的组件中使用。
C. 在 Vue 中,可以通过 app.directive() 函数声明全局自定义指令。
D. 在 Vue 中,不能为自定义指令绑定参数。
- 下列选项中,关于自定义指令常用声明周期函数及传入参数说法错误的是。()
A. mounted() 函数在绑定元素的父组件及自身的所有子节点都挂在完成后调用。
B. value 为参数 binding 中的属性,表示传递给指令的值。
C. beforeUpdate() 函数在绑定的父组件卸载前调用。
D. el 参数表示当前指令所绑定到的元素。