Install
openclaw skills install @thcjp/vue-toolkit-freeopenclaw skills install @thcjp/vue-toolkit-freeVue 3 的 Composition API 让逻辑组织更灵活,但也带来了一系列新的"隐性陷阱":响应式丢失、watch 不触发、ref 解包错乱、Provide/Inject 类型不安全等。本工具箱将这些高频问题归纳为可复用的修复模板,让 Agent 在被问及 Vue 3 相关问题时,能够直接给出"错误写法 + 正确写法 + 原因"三段式回答,而不是泛泛而谈。
免费版聚焦于"写得对"——覆盖 8 类核心陷阱与基础组件设计;性能优化、SSR、Pinia 集成等进阶主题留给专业版。
| 能力模块 | 覆盖范围 | 免费版可用 |
|---|---|---|
| 响应式陷阱 | ref/reactive 解包、解构丢失、数组索引赋值 | 是 |
| 派生状态 | computed 缓存时机、watch 副作用边界 | 是 |
| Props/Emits | 类型安全、v-model、默认值工厂 | 是 |
| 生命周期 | onMounted/onUnmounted、Suspense 异步 | 是 |
| Provide/Inject | Symbol key、响应式注入 | 是 |
| Vue Router | useRoute/useRouter、导航守卫 | 是 |
| 模板引用 | ref 命名匹配、v-for 数组引用 | 是 |
| 常见错误 | v-if/v-show、v-for key、Teleport | 是 |
| 性能优化 | shallowRef、v-memo、懒加载 | 否(专业版) |
| SSR/SSG | hydration、async setup | 否(专业版) |
| Pinia 集成 | storeToRefs、setup store | 否(专业版) |
用input_params参数进行配置。
输入: 用户提供核心功能执行所需的指令和必要参数。 处理: 解析核心功能执行的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回核心功能执行的响应数据,包含状态码、结果和日志。
input_params参数,支持创建/查询/导出操作用config_options参数进行配置。
输入: 用户提供参数配置与调用所需的指令和必要参数。 处理: 解析参数配置与调用的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回参数配置与调用的响应数据,包含状态码、结果和日志。
config_options参数,支持修改/重置/导入操作用output_format参数进行配置。
输入: 用户提供结果处理与输出所需的指令和必要参数。 处理: 解析结果处理与输出的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回结果处理与输出的响应数据,包含状态码、结果和日志。
output_format参数,支持导出/保存/转换操作
能力覆盖范围:本skill的核心能力覆盖以下场景关键词:常见陷阱、时机与组合式、API、优选实践、工具箱、开发者、Composition、下的高频问题、的取舍、的边界、组件设计与路由集、目标是让、Agent、秒内给出可直接复、用的代码片段、避免反复踩坑、when、需要代码生成、编程辅助、调试测试、开发部署时使用、不适用于无明确技、术栈的模糊需求等。这些关键词对应description中声明的使用场景,均已在上述能力点中提供对应的操作支持。开发者把 reactive 对象整体重新赋值后发现视图不更新。Agent 应识别这是 state = {...} 破坏了响应式代理,建议改用 ref 包裹对象或使用 Object.assign(state, newObj)。
用户监听 reactive 对象的深层属性但 watch 不触发。Agent 应提示 watch 默认浅监听,需开启 deep: true 或改为 getter 函数 watch(() => state.nested.value, ...)。
表单组件使用 v-model 时父组件拿到的是 string 而非 number。Agent 应指出 defineModel() 的用法,并提示 modelModifiers 处理类型转换。
<script setup> 中<script setup lang="ts">
import { ref, reactive, computed, watch, toRefs } from 'vue'
# ...
// 推荐:基本类型用 ref,对象用 reactive
const count = ref(0)
const state = reactive({ user: { name: 'Tom', age: 20 } })
# ...
// 派生状态用 computed(自动缓存)
const greeting = computed(() => `Hello, ${state.user.name}`)
# ...
// 副作用用 watch,监听响应式对象需 deep
watch(
() => state.user,
(newVal) => console.log('user changed', newVal),
{ deep: true }
)
# ...
// 解构 reactive 必须用 toRefs,否则丢失响应式
const { user } = toRefs(state)
</script>
响应解析: 完成完成后,查看输出响应确认任务状态。成功时输出包含解析摘要和响应数据;失败时根据错误信息排查问题,查阅错误解析章节获取恢复步骤。
<script setup> 骨架<script setup lang="ts">
import { ref, reactive, computed, watch, onMounted, onUnmounted } from 'vue'
# ...
// 1. 状态定义
const props = defineProps<{ msg: string }>()
const emit = defineEmits<{ (e: 'update', val: string): void }>()
# ...
// 2. 响应式数据
const count = ref(0)
const state = reactive({ list: [] as string[] })
# ...
// 3. 派生状态
const double = computed(() => count.value * 2)
# ...
// 4. 副作用
watch(count, (n) => emit('update', String(n)))
# ...
// 5. 生命周期
onMounted(() => console.log('mounted'))
onUnmounted(() => console.log('unmounted'))
</script>
<!-- 子组件 Child.vue -->
<script setup lang="ts">
const model = defineModel<string>({ default: '' })
const props = defineProps<{
items: Array<{ id: number; name: string }>
}>()
</script>
# ...
<!-- 父组件 -->
<template>
<Child v-model="text" :items="list" />
</template>
refreactiveref + .value = newObjreactive + toRefswatchwatchEffectwatch(getter, cb, { deep: true })watch 回调里修改被监听的值(易触发循环)computed 里执行副作用v-for 用 index 作为 key(除非列表完全静态)reactive 对象重新赋值后视图不更新?A:reactive 返回的是 Proxy 代理对象,整体替换会断开代理。改用 Object.assign(state, newObj) 或将整个对象用 ref 包裹后通过 .value = newObj 替换。
reactive 后变量为什么不是响应式的?A:解构会把基本类型值拷贝出来,丢失代理引用。使用 toRefs(state) 把每个属性转成 ref,或使用 toRef(state, 'key') 单独转换。
watch 监听 reactive 对象的嵌套属性为什么没触发?A:watch 默认是浅监听。监听嵌套属性需要:① 开启 deep: true;② 或使用 getter 函数 watch(() => state.nested.value, cb)。
computed 里发请求可以吗?A:不可以。computed 必须是纯函数,不能有副作用。异步派生数据请用 watchEffect + ref 或 async setup + <Suspense>。
ref 在模板里要不要写 .value?A:模板中 ref 会自动解包,直接写变量名即可;在 <script setup> 中访问必须写 .value。
v-model 怎么实现双向绑定?A:Vue 3.4+ 推荐使用 defineModel() 宏;旧写法是 :modelValue + @update:modelValue。
onMounted 里能拿到 DOM 吗?A:可以。onMounted 在组件挂载到 DOM 后执行,此时通过模板引用(ref="el")可以访问真实 DOM 节点。
本免费体验版限制以下高级功能:
解锁全部功能请使用专业版:vue-toolkit-pro
defineModel)| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| LLM API | API | 必需 | 由 Agent 平台内置 LLM 提供 |
| Vue 3 | npm 包 | 必需 | npm install vue@^3.4 |
| TypeScript | npm 包 | 可选 | npm install -D typescript |
| Vue Router | npm 包 | 可选 | npm install vue-router@4 |
| Vite | 构建工具 | 可选 | npm create vite@latest |
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| 配置错误 | 参数缺失或格式错误 | 检查依赖说明中的配置要求 |
| 运行时错误 | 运行环境不满足 | 确认运行环境符合依赖说明 |
| 网络错误 | 连接超时或不可达 | 执行ping命令测试网络连通性,检查防火墙和代理设置连接后执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令,参考国内替代方案 |
{
"success": true,
"data": {
"result": "Vue工具箱(免费版)处理结果",
"execution_time": "0.5s",
"metadata": {
"version": "1.0",
"processor": "vuekit"
}
},
"execution_log": ["解析输入参数", "执行核心处理", "格式化输出结果"],
"error": null
}