组合式函数

利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数。对应 Vue2 的 mixin,但是更优化

作用:抽离封装状态逻辑,进行复用

规范:

  • 命名:use 开头,驼峰命名法,如 useFetch
  • 入参:兼容传入 ref 和不传入 ref 的情况:const value = unref( para ) 或者 const value = toValue( para )(3.3+)
  • 返回值:始终返回一个包含多个 ref 的普通的非响应式对象:return { x: refA, y: refB }
  • 组合式函数只能在 <script setup>setup() 钩子中调用,也只能被同步地调用

插件

插件通常用来为 Vue 添加全局功能

app.use(myPlugin, {
  /* 可选的选项 */
})

一般来说,插件发挥作用的方式有:

  • 通过 app.component()app.directive() 注册一到多个全局组件或自定义指令
  • 通过 app.provide() 使一个资源可被注入进整个应用
  • app.config.globalProperties 中添加一些全局实例属性或方法

自定义指令

除了内置指令外,还可以编写自定义指令,用来复用涉及普通元素的底层 DOM 访问的逻辑

使用时机:只有当所需功能只能通过直接的 DOM 操作来实现时,才应该使用自定义指令

局部注册:

任何以 v 开头的驼峰式命名的变量都可以被用作一个自定义指令

<script setup>
// 在模板中启用 v-focus
const vFocus = {
  mounted: (el) => el.focus()
}
</script>
 
<template>
  <input v-focus />
</template>

全局注册:

在所有组件中都可用

app.directive('focus', {
  /* ... */
})

Warning

不推荐在组件上使用自定义指令。当组件具有多个根节点时可能会出现预期外的行为

渲染函数 & JSX

Vue 提供了一个 h() 函数用于创建 vnodes:

import { h } from 'vue'
 
const vnode = h(
  'div', // type
  { id: 'foo', class: 'bar' }, // props
  [
    /* children */
  ]
)

h 函数虽然灵活但是写起来复杂,所有可以使用 JSX 语法