Install
openclaw skills install @thcjp/vue-component-gen-tool-freeopenclaw skills install @thcjp/vue-component-gen-tool-freevue-component-gen-tool-free 为个人开发者提供 Vue 3 单文件组件模板的快速生成能力。它支持 Composition API、Options API、<script setup> 语法与 TypeScript,帮助你快速搭建标准化组件,适合个人项目、学习实践与小型应用开发。
本工具通过自然语言指令或 CLI 风格命令驱动 Agent 输出组件代码,无需额外安装私有脚本。
| 能力 | 说明 |
|---|---|
| 单文件组件生成 | 生成完整的 .vue 文件(template/(请参考skill目录中的脚本文件)) |
| Composition API | 推荐 API,基于 setup 函数 |
| Options API | 传统 API,适合旧项目兼容 |
<script setup> | Vue 3 推荐语法,更简洁 |
| TypeScript 支持 | 类型化的 Props、Emits、Ref |
| SCSS 支持 | 嵌套样式与变量 |
| Props/Emits 定义 | 类型安全的组件接口 |
技术实现要点:核心能力基于input_params参数与output_format配置实现,支持创建/查询/修改/删除等操作模式,通过config_options进行运行时配置。 |
用input_params参数进行配置。
输入: 用户提供核心功能执行所需的指令和必要参数。 处理: 解析核心功能执行的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回核心功能执行的响应数据,包含状态码、结果和日志。
input_params参数,支持创建/查询/导出操作用config_options参数进行配置。
输入: 用户提供参数配置与调用所需的指令和必要参数。 处理: 解析参数配置与调用的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回参数配置与调用的响应数据,包含状态码、结果和日志。
config_options参数,支持修改/重置/导入操作用output_format参数进行配置。
输入: 用户提供结果处理与输出所需的指令和必要参数。 处理: 解析结果处理与输出的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回结果处理与输出的响应数据,包含状态码、结果和日志。
output_format参数,支持导出/保存/转换操作
能力覆盖范围:本skill的核心能力覆盖以下场景关键词:面向个人开发者的、组件模板生成工具、组件生成工具免费、版为个人开发者提、单文件组件模板快、速生成能力、一键生成、Use、when、需要代码生成、编程辅助、调试测试、开发部署时使用、不适用于无明确技、术栈的模糊需求等。这些关键词对应description中声明的使用场景,均已在上述能力点中提供对应的操作支持。生成一个 MyButton 组件,用 Composition API 和 TypeScript
<template>
<div class="my-button">
<button @click="handleClick">
{{ label }}
</button>
</div>
</template>
# ...
<script setup lang="ts">
import { ref } from 'vue'
# ...
interface Props {
label?: string
}
# ...
const props = withDefaults(defineProps<Props>(), {
label: 'Click me'
})
# ...
const emit = defineEmits<{
(e: 'click'): void
}>()
# ...
const handleClick = () => {
emit('click')
}
</script>
# ...
<style scoped>
.my-button {
padding: 10px 20px;
}
</style>
生成一个 InputField 组件,带 v-model 支持,使用 TypeScript
<template>
<div class="input-field">
<label v-if="label" :for="id">{{ label }}</label>
<input
:id="id"
:type="type"
:value="modelValue"
:placeholder="placeholder"
@input="onInput"
/>
</div>
</template>
# ...
<script setup lang="ts">
interface Props {
modelValue: string
label?: string
type?: string
placeholder?: string
id?: string
}
# ...
const props = withDefaults(defineProps<Props>(), {
type: 'text',
label: '',
placeholder: '',
id: () => `input-${Math.random().toString(36).slice(2, 9)}`
})
# ...
const emit = defineEmits<{
(e: 'update:modelValue', value: string): void
}>()
# ...
const onInput = (event: Event) => {
const target = event.target as HTMLInputElement
emit('update:modelValue', target.value)
}
</script>
# ...
<style scoped>
.input-field {
display: flex;
flex-direction: column;
gap: 0.25rem;
}
input {
padding: 0.5rem 0.75rem;
border: 1px solid #ddd;
border-radius: 4px;
}
</style>
生成一个 Modal 组件,带 v-model:open 支持,使用 SCSS
<template>
<Teleport to="body">
<Transition name="modal">
<div v-if="open" class="modal-overlay" @click.self="close">
<div class="modal">
<header class="modal-header">
<h3>{{ title }}</h3>
<button class="close-btn" @click="close">×</button>
</header>
<div class="modal-body">
<slot />
</div>
<footer class="modal-footer">
<slot name="footer" :close="close" />
</footer>
</div>
</div>
</Transition>
</Teleport>
</template>
# ...
<script setup lang="ts">
interface Props {
open: boolean
title?: string
}
# ...
const props = withDefaults(defineProps<Props>(), {
title: ''
})
# ...
const emit = defineEmits<{
(e: 'update:open', value: boolean): void
}>()
# ...
const close = () => emit('update:open', false)
</script>
# ...
<style lang="scss" scoped>
.modal-overlay {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
# ...
.modal {
background: #fff;
border-radius: 8px;
max-width: 480px;
width: 90%;
# ...
.modal-header,
.modal-footer {
padding: 1rem;
}
# ...
.modal-body {
padding: 1rem;
}
}
}
# ...
.modal-enter-active,
.modal-leave-active {
transition: opacity 0.25s;
}
.modal-enter-from,
.modal-leave-to {
opacity: 0;
}
</style>
直接在对话中描述你需要的组件,例如:
生成一个 UserCard 组件,显示头像、姓名和邮箱,用 Composition API 和 TypeScript。
工具会输出完整的 .vue 文件,包含 template、script、style 三部分。
# 将代码保存为组件文件
# src/components/UserCard.vue
# ...
# 在父组件中使用
# <UserCard :user="currentUser" />
| 命令 | 说明 |
|---|---|
vue-component-gen-tool MyButton --api composition | 生成 Composition API 组件 |
vue-component-gen-tool MyModal --api options | 生成 Options API 组件 |
vue-component-gen-tool MyForm --typescript | 启用 TypeScript |
vue-component-gen-tool MyModal --scss | 启用 SCSS |
vue-component-gen-tool MyButton -o ./src/components | 指定输出目录 |
| API 类型 | 语法 | 推荐度 | 说明 |
|---|---|---|---|
composition | <script setup> | 推荐 | Vue 3 最佳实践,简洁高效 |
options | export default { ... } | 兼容 | 旧项目兼容,新项目不推荐 |
script-setup | <script setup> | 推荐 | 等同 composition,显式声明 |
<script setup lang="ts">:Vue 3 推荐语法,TypeScript 提供类型安全。interface Props { ... } 比 defineProps({ ... }) 更清晰。defineEmits<{ (e: 'click', id: string): void }>() 保证类型安全。withDefaults 处理默认值:TypeScript 模式下用 withDefaults 设置 Props 默认值。scoped:避免样式泄漏到全局,影响其他组件。v-model 用 update:modelValue:Vue 3 的标准 v-model 协议。UserCard.vue 而非 user-card.vue,与组件名一致。defineProps 宏:编译期宏,无需导入,类型推断更准确。新项目优先 Composition API,逻辑复用更灵活,TypeScript 支持更好。旧项目兼容或简单组件可用 Options API。
<script setup> 和普通 setup() 函数怎么选?优先 <script setup>,语法更简洁,编译期优化更好。仅在需要动态渲染函数或额外配置时用普通 setup()。
用 withDefaults(defineProps<Props>(), { label: 'Click me' })。withDefaults 是编译期宏,提供类型安全的默认值。
v-model 双向绑定?Props 定义 modelValue,Emits 定义 update:modelValue。在输入事件中触发 emit('update:modelValue', newValue)。
免费版支持单组件生成与基础 API 类型;Pro 版扩展企业级组件库结构、批量生成、可访问性增强、单元测试模板与 CI 集成。
<script setup> 与 TypeScript)| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| Vue 3 | npm 包 | 必需 | npm i vue |
| TypeScript | npm 包 | 推荐 | npm i -D typescript |
| sass | npm 包 | 可选 | npm i -D sass(使用 SCSS 时) |
| vite | 构建工具 | 推荐 | npm i -D vite @vitejs/plugin-vue |
| LLM API | API | 必需 | 由 Agent 内置 LLM 提供 |
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| 配置错误 | 参数缺失或格式错误 | 检查依赖说明中的配置要求 |
| 运行时错误 | 运行环境不满足 | 确认运行环境符合依赖说明 |
| 网络错误 | 连接超时或不可达 | 执行ping命令测试网络连通性,检查防火墙和代理设置连接后执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令,参考国内替代方案 |
{
"success": true,
"data": {
"result": "Vue组件生成(免费版)处理结果",
"execution_time": "0.5s",
"metadata": {
"version": "1.0",
"processor": "vue component gen"
}
},
"execution_log": ["解析输入参数", "执行核心处理", "格式化输出结果"],
"error": null
}