Install
openclaw skills install vue-composition-api-best-practicesVue 3 组合式 API 与 <script setup> 最佳实践。涵盖代码组织、useXxx 模式、组合式函数设计、Store 集成、响应性优化及功能提取。
openclaw skills install vue-composition-api-best-practicesVue 3 组合式 API 与 <script setup>、TypeScript 集成及代码组织模式的最佳实践。
本技能面向 Vue 3.3+,部分功能需要更高的次版本号:
| 特性 | 最低版本 | 参考 |
|---|---|---|
defineOptions | 3.3+ | script-setup |
toValue() | 3.3+ | script-setup |
defineModel | 3.4+ | script-setup |
watch 搭配 once 选项 | 3.4+ | reactivity |
useTemplateRef() | 3.5+ | script-setup |
useId() | 3.5+ | script-setup |
onWatcherCleanup() | 3.5+ | reactivity |
| 问题 | 参考阅读 |
|---|---|
我的 <script setup> 很乱,难以浏览 | SFC 代码组织 |
| 某个功能的逻辑分散在很多行中 | useXxx 函数模式 |
| 相同逻辑在多个组件中重复 | 功能提取 |
| 两个功能相互影响,但不知道正确的处理模式 | 跨功能依赖 |
Props/emits 类型安全、defineModel 使用 | script setup 最佳实践 |
| 在 hooks/工具函数/插件中无法访问 Store | 组件外 Store 访问 |
| 如何组织新的组合式函数文件 | 组合式函数设计模式 |
| 页面感觉慢,可能是响应性问题 | 响应性与性能 |
| 如何测试组合式函数 | 组合式函数测试 |
类型安全的 provide/inject | script setup - Provide/Inject |
1. defineOptions → 组件名称
2. defineProps → Props 类型声明
3. defineModel → 双向绑定(3.4+)
4. inject → 注入依赖
5. defineEmits → 事件类型声明
6. Store 声明 → useXxxStore()
7. 外部 hooks → useI18n()、useDesign() 等
8. 功能声明 → const { ... } = useFeature()
9. provide → 提供依赖
10. defineExpose → 暴露公共 API
11. 功能实现 → function useFeature() {}
基本类型 → ref
需要深层响应 → ref
大型对象/动态组件 → shallowRef
不需要重新赋值 → reactive(谨慎使用)
永不响应式 → markRaw + shallowRef
组件内 (<script setup>) → useAppStore()
组件外 (hooks/utils/plugins) → useAppStoreWithOut()
解构保持响应式 → storeToRefs(store)
| # | 反模式 | 正确做法 |
|---|---|---|
| 1 | 解构 props → 丢失响应式 | toRefs(props) 或直接用 props.xxx |
| 2 | 组件外用 useXxxStore() | 用 useXxxStoreWithOut() |
| 3 | ref 用于动态组件/大对象 | 用 shallowRef |
| 4 | 混用 Options API + script setup | 只选一种风格 |
| 5 | 事件监听不清理 | onUnmounted 中移除 / 使用 VueUse 的 useEventListener |
| 场景 | 推荐模式 |
|---|---|
| 父子组件通信 | Props + Emits |
| 兄弟功能交互 | 回调参数(onXxxChange) |
| 跨层级多对多 | 事件总线(useEmitt) |
| 共享状态 | Store 桥接组合式函数 |
| 功能编排 | 组合式函数编排模式 |