Install
openclaw skills install @wufengsheng/element-plus-docsElement Plus 基于 Vue 3 的桌面端组件库中文文档 — 包含 83+ 个组件的 API 参考、使用示例、设计指南、安装快速上手
openclaw skills install @wufengsheng/element-plus-docs基于 Vue 3 的桌面端组件库完整中文参考。本技能整合了 Element Plus 官方文档的核心内容,包含组件 API、可直接运行的代码示例、设计原则和快速上手指导。
当用户提问涉及以下任一情况时,应立即启用本技能:
<script setup>)📋 完整组件列表见
references/index.md(83 个组件 + 13 篇指南 + 6 篇补充文档)
以下示例均提取自官方文档,涵盖最常用的使用模式。所有示例使用 Vue 3 Composition API(<script setup>)。
<template>
<!-- 类型变体 -->
<el-button>Default</el-button>
<el-button type="primary">主要按钮</el-button>
<el-button type="success">成功按钮</el-button>
<el-button type="danger">危险按钮</el-button>
<!-- 朴素按钮 + 圆角 + 虚线 -->
<el-button plain>Plain</el-button>
<el-button type="primary" round>Round</el-button>
<el-button type="primary" dashed>Dashed</el-button>
<!-- 带图标 + 加载态 -->
<el-button type="primary" :icon="Search" :loading="isLoading">
{{ isLoading ? '搜索中...' : '搜索' }}
</el-button>
<!-- 图标按钮组 -->
<el-button-group>
<el-button type="primary" :icon="ArrowLeft">上一页</el-button>
<el-button type="primary">下一页<el-icon class="el-icon--right"><ArrowRight /></el-icon></el-button>
</el-button-group>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { Search, ArrowLeft, ArrowRight } from '@element-plus/icons-vue'
const isLoading = ref(false)
</script>
<template>
<el-table :data="tableData" border stripe style="width: 100%" v-loading="loading">
<el-table-column prop="name" label="姓名" width="120" />
<el-table-column prop="role" label="角色" />
<el-table-column label="操作" width="180">
<template #default="scope">
<el-button size="small" @click="handleEdit(scope.row)">编辑</el-button>
<el-button size="small" type="danger" @click="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
v-model:current-page="page"
v-model:page-size="pageSize"
:page-sizes="[10, 20, 50, 100]"
layout="total, sizes, prev, pager, next"
:total="total"
@size-change="handleSizeChange"
@current-change="handlePageChange"
/>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const loading = ref(false)
const tableData = ref([])
const page = ref(1)
const pageSize = ref(10)
const total = ref(0)
const handleEdit = (row: any) => { console.log('edit', row) }
const handleDelete = (row: any) => { console.log('delete', row) }
const handleSizeChange = (size: number) => { pageSize.value = size }
const handlePageChange = (p: number) => { page.value = p }
</script>
<template>
<el-form ref="formRef" :model="form" :rules="rules" label-width="auto" status-icon>
<el-form-item label="密码" prop="pass">
<el-input v-model="form.pass" type="password" autocomplete="off" />
</el-form-item>
<el-form-item label="确认密码" prop="checkPass">
<el-input v-model="form.checkPass" type="password" autocomplete="off" />
</el-form-item>
<el-form-item label="年龄" prop="age">
<el-input v-model.number="form.age" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm">提交</el-button>
<el-button @click="resetForm">重置</el-button>
</el-form-item>
</el-form>
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue'
import type { FormInstance, FormRules } from 'element-plus'
const formRef = ref<FormInstance>()
const form = reactive({
pass: '',
checkPass: '',
age: '',
})
const validatePass2 = (_rule: any, value: string, callback: any) => {
if (value === '') {
callback(new Error('请再次输入密码'))
} else if (value !== form.pass) {
callback(new Error('两次输入密码不一致!'))
} else {
callback()
}
}
const checkAge = (_rule: any, value: number, callback: any) => {
if (!value) return callback(new Error('请输入年龄'))
if (!Number.isInteger(value)) return callback(new Error('请输入数字'))
if (value < 18) return callback(new Error('年龄必须大于 18 岁'))
callback()
}
const rules = reactive<FormRules>({
pass: [
{ required: true, message: '请输入密码', trigger: 'blur' },
{ min: 6, max: 20, message: '长度在 6 到 20 个字符', trigger: 'blur' },
],
checkPass: [{ validator: validatePass2, trigger: 'blur' }],
age: [{ validator: checkAge, trigger: 'blur' }],
})
const submitForm = () => {
formRef.value?.validate((valid) => {
if (valid) console.log('提交数据:', form)
else console.log('验证失败')
})
}
const resetForm = () => {
formRef.value?.resetFields()
}
</script>
import { ElMessage, ElNotification, ElMessageBox } from 'element-plus'
// 四种类型的消息提示
ElMessage.success('操作成功')
ElMessage.warning('请注意检查')
ElMessage.error('操作失败')
ElMessage.info('这是一条普通消息')
// 带配置的弹出通知
ElNotification({
title: '提醒',
message: '你有新的订单待处理',
type: 'warning',
duration: 5000,
position: 'top-right',
})
// 确认对话框(替代原生 confirm)
ElMessageBox.confirm('确定删除该条记录吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
ElMessage.success('删除成功')
}).catch(() => {
ElMessage.info('已取消删除')
})
⚠️ 上下文优化:参考文档已拆分为 102 个独立文件(每个组件/指南一个文件)。按需查阅,无需一次性加载。单文件平均 < 5K tokens。
references/llms.txt(快速发现入口,标准格式索引全部文档)references/index.md(~900 tokens,按类别列出全部组件)references/components/{组件名}.md(83 个文件)references/guides/{指南名}.md(13 个文件)references/extra-guides/{文档名}.md(更新日志、设计原则等)查 Table 组件 → references/components/table.md (~15K tokens)
查 Button 组件 → references/components/button.md (~4K tokens)
查 Form 验证 → references/components/form.md (~10K tokens)
查安装指南 → references/guides/installation.md (~3K tokens)
查快速上手 → references/guides/quickstart.md (~3K tokens)
查组件列表 → references/index.md (~900 tokens)
1. 先在 index.md 确认组件文件名
2. 读取 components/{组件名}.md 获取完整文档
3. 不要一次性加载所有组件文件(会超出上下文窗口)
1. 读取目标组件的 .md 文件
2. 寻找代码块(```vue 或 ```typescript)—— 这些是来自官方文档的完整示例
3. 示例使用 <script setup lang="ts">,可直接复制使用
4. 优先提取核心 <el-*> 模板和关键的 ref/reactive 状态
Attributes 表格(中文表头):
- 属性名 → prop 名称(版本标记如 2.2.0 表示引入版本)
- 说明 → 中文描述
- 类型 → string / boolean / number / enum / Component
- 默认值 → "-" 表示无默认值
Events / Slots / Exposes 表格同理
| 需求 | 搜索关键词 | 关键组件/属性 |
|---|---|---|
| 表单验证 | el-form + rules | rules 对象、validator 自定义校验函数、formRef.value.validate() |
| 表格分页 | el-table + Pagination | el-pagination 的 @current-change、v-model:current-page |
| 表格多选 | el-table + selection | type="selection" 列 + @selection-change |
| 远程搜索下拉 | remote + el-select | remote、:remote-method、filterable |
| 文件上传 | el-upload | action、:before-upload、:on-success、:file-list |
| 全局提示 | ElMessage / ElNotification | 从 element-plus 导入,JS 方法调用 |
| 确认弹窗 | ElMessageBox.confirm | 返回 Promise,.then() 处理确认 |
| 树形控件 | el-tree | :data、node-key、check-strictly |
| 暗黑模式 | dark + CSS Vars | html.dark 类 + import 'element-plus/theme-chalk/dark/css-vars.css' |
<script setup lang="ts">)ElMessage、ElNotification、ElMessageBox)需要从 element-plus 导入,不再挂载于 thisref() + formRef.value,而非 this.$refs.xxxv-model 支持多个绑定(v-model:current-page、v-model:page-size)@element-plus/icons-vue 包导入,不再使用 class 名<script setup>),不支持 Vue 2 Options APIunplugin-vue-components 实现自动按需引入;也可使用 app.use(ElementPlus) 全局注册v-model):所有表单组件均支持 v-model;支持多个 v-model 绑定(如 v-model:current-page)$emit 派发事件,常用事件:change、update:modelValue、click、blur、focus#header、#footer、#default、#content)和作用域插槽ElMessage、ElMessageBox、ElNotification 从 element-plus 导入后在任意位置调用ref 操作:通过 const formRef = ref<FormInstance>() 获取组件实例,调用其方法(如 validate()、resetFields())append-to-bodyhtml.dark 类切换 + CSS Vars 技术实现,可覆盖 CSS 变量自定义主题⚠️ 本技能示例代码仅演示组件用法,未经生产安全审查。复制到生产环境前请完成以下加固:
accept 属性仅为客户端提示,可被绕过。服务端必须独立验证文件类型、大小和内容,使用随机文件名存储v-html、自定义渲染模板或动态插槽内容时,必须对用户输入做 HTML 实体转义el-form 验证规则仅提升用户体验,不可替代服务端校验。敏感操作(密码修改、支付、权限变更)必须服务端二次验证type="password")传输时必须使用 HTTPS,禁止在 URL 参数或日志中传递明文密码| Element UI (Vue 2) | Element Plus (Vue 3) |
|---|---|
this.$message() | import { ElMessage } from 'element-plus' |
this.$refs.xxx.validate() | const ref = ref<FormInstance>(); ref.value?.validate() |
slot-scope="scope" | #default="scope" 或 v-slot |
v-model 单个绑定 | 支持多 v-model(如 v-model:current-page) |
图标 class 名(el-icon-xxx) | 组件导入(import { Search } from '@element-plus/icons-vue') |
data(), methods, computed | <script setup> + ref() / reactive() / computed() |
Vue.use(ElementUI) | app.use(ElementPlus) 或按需引入 |
Generated by Skill Seeker + manual optimization — 基于 Element Plus 官方中文文档 v2.14.3