一. Vue
中自定义指令
1.认识自定义指令
- 在
Vue
的模板语法中我们学习过各种各样的指令:v-show
、v-for
、v-model
等,除了使用这些指令之外,Vue
也允许我们来自定义自己的指令- 注意:在
Vue
中,代码的复用和抽象主要还是通过组件 - 通常在某些情况下,你需要对
DOM
元素进行底层操作,这个时候就会用到自定义指令
- 注意:在
- 自定义指令分为两种:
- 自定义局部指令:组件中通过
directives
选项,只能在当前组件中使用 - 自定义全局指令:
app
的directive
方法,可以在任意组件中被使用
- 自定义局部指令:组件中通过
- 比如我们来做一个非常简单的案例:当某个元素挂载完成后可以自定获取焦点
- 实现方式一:如果我们使用默认的实现方式
- 实现方式二:自定义一个
v-focus
的局部指令 - 实现方式三:自定义一个
v-focus
的全局指令
2.实现方式一:聚焦的默认实现
3.实现方式二:局部自定义指令
实现方式二:自定义一个
v-focus
的局部指令- 这个自定义指令实现非常简单,我们只需要在组件选项中使用
directives
即可 - 它是一个对象,在对象中编写我们自定义指令的名称(注意:这里不需要加
v-
) - 自定义指令有一个生命周期,是在组件挂载后调用的
mounted
,我们可以在其中完成操作
- 这个自定义指令实现非常简单,我们只需要在组件选项中使用
4.方式三:自定义全局指令
- 自定义一个全局的
v-focus
指令可以让我们在任何地方直接使用

5.指令的生命周期
- 一个指令定义的对象,
Vue
提供了如下的几个钩子函数:created
:在绑定元素的attribute
或事件监听器被应用之前调用beforeMount
:当指令第一次绑定到元素并且在挂载父组件之前调用mounted
:在绑定元素的父组件被挂载后调用beforeUpdate
:在更新包含组件的VNode
之前调用updated
:在包含组件的VNode
及其子组件的VNode
更新后调用beforeUnmount
:在卸载绑定元素的父组件之前调用unmounted
:当指令与元素解除绑定且父组件已卸载时,只调用一次
6.指令的参数和修饰符
- 如果我们指令需要接受一些参数或者修饰符应该如何操作呢?
info
是参数的名称aaa-bbb
是修饰符的名称- 后面是传入的具体的值
- 在我们的生命周期中,我们可以通过
bindings
获取到对应的内容:

7.自定义指令练习
- 自定义指令案例:时间戳的显示需求:
- 在开发中,大多数情况下从服务器获取到的都是时间戳
- 我们需要将时间戳转换成具体格式化的时间来展示
- 在
Vue2
中我们可以通过过滤器来完成 - 在
Vue3
中我们可以通过 计算属性computed
或者 自定义一个方法methods
来完成 - 其实我们还可以通过一个自定义的指令来完成
- 我们来实现一个可以自动对时间格式化的指令
v-format-time
- 这里我封装了一个函数,在首页中我们只需要调用这个函数并且传入
app
即可
- 这里我封装了一个函数,在首页中我们只需要调用这个函数并且传入

二. Vue
内置组件Teleport
1.认识Teleport
- 在组件化开发中,我们封装一个组件
A
,在另外一个组件B
中使用:- 那么组件
A
中template
的元素,会被挂载到组件B
中template
的某个位置 - 最终我们的应用程序会形成一颗
DOM
树结构
- 那么组件
- 但是某些情况下,我们希望组件不是挂载在这个组件树上的,可能是移动到
Vue app
之外的其他位置:- 比如移动到
body
元素上,或者我们有其他的div#app
之外的元素上 - 这个时候我们就可以通过
teleport
来完成
- 比如移动到
Teleport
是什么呢?- 它是一个
Vue
提供的内置组件,类似于react
的Portals
teleport
翻译过来是心灵传输、远距离运输的意思- 它有两个属性:
to
:指定将其中的内容移动到的目标元素,可以使用选择器- d
isabled
:是否禁用teleport
的功能
- 它有两个属性:
- 它是一个

2.和组件结合使用
- 当然,
teleport
也可以和组件结合一起来使用:- 我们可以在
teleport
中使用组件,并且也可以给他传入一些数据
- 我们可以在

3.多个teleport
- 如果我们将多个
teleport
应用到同一个目标上(to
的值相同),那么这些目标会进行合并:

- 实现效果如下:

三. Vue
内置组件Suspense
注意:目前
Suspense
显示的是一个实验性的特性,API
随时可能会修改Suspense
是一个内置的全局组件,该组件有两个插槽:default
:如果default
可以显示,那么显示default
的内容fallback
:如果default
无法显示,那么会显示fallback
插槽的内容
四. Vue
中安装插件的方式
1.认识Vue
插件
- 通常我们向
Vue
全局添加一些功能时,会采用插件的模式,它有两种编写方式:- 对象类型:一个对象,但是必须包含一个
install
的函数,该函数会在安装插件时执行 - 函数类型:一个
function
,这个函数会在安装插件时自动执行
- 对象类型:一个对象,但是必须包含一个
- 插件可以完成的功能没有限制,比如下面的几种都是可以的:
- 添加全局方法或者
property
,通过把它们添加到config.globalProperties
上实现 - 添加全局资源:指令/过滤器/过渡等
- 通过全局
mixin
来添加一些组件选项 - 一个库,提供自己的
API
,同时提供上面提到的一个或多个功能
- 添加全局方法或者
2.插件的编写方式

五. Vue
中渲染函数的使用
1.认识h
函数
Vue
推荐在绝大数情况下使用模板template
来创建你的HTML
,然后一些特殊的场景,你真的需要JavaScript
的完全编程的能力,这个时候你可以使用渲染函数,它比模板更接近编译器- 前面我们讲解过
VNode
和VDOM
的概念:Vue
在生成真实的DOM
之前,会将我们的节点转换成VNode
,而VNode
组合在一起形成一颗树结构,就是虚拟DOM(VDOM)
- 事实上,我们之前编写的**
template
中的HTML
最终也是使用render
渲染函数生成对应的VNode
** - 然后交给
diff
算法对新旧VNode
来进行对比,然后决定对具体的VNode
所映射的真实dom
来进行更新 - 那么,如果你想充分的利用
js
的编程能力,我们可以自己来编写createVNode
函数,生成对应的VNode
- 那么我们应该怎么来做呢?使用
h
函数:h
函数是一个用于创建vnode
的一个函数- 其实更具体的命名是
createVNode
函数,但是为了简便在Vue
将之简化为h
函数
2.h
函数如何使用呢?
h
函数如何使用呢?它接受三个参数:
- 注意事项:
- 如果没有
props
,那么通常可以将children
作为第二个参数传入 - 如果会产生歧义,可以将
null
作为第二个参数传入,将children
作为第三个参数传入
- 如果没有
3.h
函数的基本使用
h
函数可以在两个地方使用:render
函数选项中
setup
函数选项中(setup
本身需要是一个函数类型,函数再返回h
函数创建的VNode
)
六. Vue
中编写jsx
的语法
1.jsx
的babel
配置
如果我们希望在项目中使用
jsx
,那么我们需要添加对jsx
的支持:jsx
我们通常会通过Babel
来进行转换(React
编写的jsx
就是通过babel
转换的)- 对于
Vue
来说,我们只需要在Babel
中配置对应的插件即可
安装
Babel
支持Vue
的jsx
插件:jsnpm i @vue/babel-plugin-jsx -D
如果是
Vite
环境,需要安装插件:jsnpm i @vitejs/plugin-vue-jsx -D
在
babel.config.js
配置文件中配置插件:

2.jsx
计数器案例
options api
中使用:composition api
中使用: