Vue3 中 <script setup> 场景下,需要手动导入和不需要手动导入的内容整理

以下是 Vue3 中 <script setup> 场景下,需要手动导入不需要手动导入的内容整理(按使用场景分类):

分类 需要手动导入(必须 import 不需要手动导入(直接使用)
响应式与状态 - refreactive、computed(计算属性) - watchwatchEffect(数据监听) - 示例:import { ref, computed } from 'vue' 无(响应式 API 均需导入)
生命周期钩子 - onMountedonUpdatedonUnmounted 等(组件生命周期) - 示例:import { onMounted } from 'vue' 无(生命周期钩子均需导入)
组件与模板 - 非组件的工具类(如 useSlotsuseAttrs 用于脚本中访问插槽/属性) - 示例:import { useSlots } from 'vue' - 导入的组件(直接在模板使用,无需注册) 示例:import Child from './Child.vue' 后直接用 <Child/>
编译器宏(核心) 无(宏函数由编译器处理,无法导入) - defineProps(声明 props) - defineEmits(声明事件) - defineExpose(暴露组件内容) - defineOptions(声明组件选项,Vue3.3+) - defineModel(双向绑定简化,Vue3.4+) 示例:const props = defineProps({ title: String })
特殊语法与变量 - nextTick(DOM 更新后执行) - 工具函数(isRefunreftoRefs 等) 示例:import { nextTick, isRef } from 'vue' - 顶层 await(直接使用,无需包裹 async) 示例:const data = await fetch(...) - 模板中直接使用 $attrs$slots(脚本中需通过 useAttrs/useSlots 导入) 示例:模板中 <div v-bind="$attrs"></div>
全局 API - createAppdefineComponentdefineAsyncComponent 等(通常在入口文件使用) 示例:import { createApp } from 'vue' 无(全局 API 均需导入)

关键说明:

  1. 编译器宏(defineXXX :是 <script setup> 专属语法,由 Vue 编译器直接解析,绝对不能导入(导入会报错)。
  2. 组件自动注册 :仅在 <script setup> 中导入的组件有此特性,选项式 API 仍需手动注册到 components 选项中。
  3. 模板 vs 脚本$attrs$slots 在模板中可直接使用,但在 <script setup> 脚本中需通过 useAttrs()useSlots() 导入后访问。
  4. 版本兼容性defineOptions(3.3+)、defineModel(3.4+)是新增宏,低版本 Vue 不支持。