【ElementPlus】深入探索ElementPlus:前端界面的全能组件库
📚 引言
在现代 Web 开发中,创建既美观又功能强大的用户界面是一项挑战。Element Plus,作为 Vue 3 生态中的明星 UI 组件库,以其丰富的组件、优秀的性能和易用性赢得了广大开发者的青睐。
本文将全面覆盖 Element Plus 的 常用核心组件,通过 深度分析、最佳实践案例 以及 详细的代码示例,帮助你掌握如何在实际项目中高效利用 Element Plus,构建现代化、响应式的企业级应用。
🛠️ 核心组件详解与应用(含完整参数说明)
1. 🎯 el-button
按钮组件
按钮是用户界面中最基本的交互元素之一。Element Plus 的 el-button
提供了多种类型、尺寸和状态,满足各种场景需求。
✅ 参数说明(Props)
参数 | 类型 | 可选值 | 默认值 | 说明 |
| string |
|
| 按钮尺寸 |
| string |
| — | 按钮类型 |
| boolean | — |
| 是否为朴素按钮(背景透明,仅边框和文字) |
| boolean | — |
| 是否为圆角按钮 |
| boolean | — |
| 是否为圆形图标按钮 |
| boolean | — |
| 是否加载中状态 |
| boolean | — |
| 是否禁用 |
| string / Component | — | — | 图标组件,可使用 中的图标 |
| boolean | — |
| 是否自动聚焦 |
| string |
|
| 原生 type 属性 |
🧩 事件(Events)
事件名 | 说明 | 回调参数 |
| 点击按钮时触发 | — |
💡 使用说明与示例
<template><div class="button-group"><!-- 基础按钮 --><el-button>默认按钮</el-button><el-button type="primary">主要按钮</el-button><el-button type="success">成功按钮</el-button><el-button type="info">信息按钮</el-button><el-button type="warning">警告按钮</el-button><el-button type="danger">危险按钮</el-button><!-- 朴素按钮 --><el-button plain>朴素按钮</el-button><el-button type="primary" plain>朴素主要按钮</el-button><!-- 圆角按钮 --><el-button round>圆角按钮</el-button><el-button type="primary" round>圆角主要按钮</el-button><!-- 图标按钮 --><el-button type="primary" icon="Edit" circle /><el-button type="success" icon="Check" circle /><el-button type="danger" icon="Delete" circle /><!-- 加载状态 --><el-button type="primary" :loading="true">加载中</el-button><!-- 禁用状态 --><el-button type="primary" disabled>禁用按钮</el-button></div>
</template><script setup>
import { Edit, Check, Delete } from '@element-plus/icons-vue'
</script>
2. 🖼️ el-icon
图标组件
el-icon
是 Element Plus 的图标容器,用于统一管理图标样式和行为。
✅ 参数说明(Props)
参数 | 类型 | 可选值 | 默认值 | 说明 |
| string / number | — | — | 图标大小 |
| string | — | — | 图标颜色 |
| string | — | — | 自定义类名 |
⚠️ 注意:图标本身通过默认插槽传入,如 <el-icon><Edit /></el-icon>
💡 使用说明
<template><el-icon :size="20" color="#409eff"><Edit /></el-icon><el-icon class="custom-icon"><Setting /></el-icon>
</template><script setup>
import { Edit, Setting } from '@element-plus/icons-vue'
</script><style>
.custom-icon {color: #67c23a;font-size: 24px;
}
</style>
3. 💬 el-message
消息提示组件
用于轻量级的全局消息提示,不打断用户操作。
✅ 方法调用(非组件 Props)
import { ElMessage } from 'element-plus'// 基本用法
ElMessage('这是一条消息')// 指定类型
ElMessage.success('操作成功')
ElMessage.warning('警告内容')
ElMessage.error('错误信息')
ElMessage.info('提示信息')// 自定义配置
ElMessage({message: '自定义消息',type: 'success',duration: 3000, // 显示时间,毫秒showClose: true, // 是否显示关闭按钮center: true, // 文字是否居中offset: 60, // 距离窗口顶部的偏移量onClose: () => console.log('消息关闭')
})
✅ 配置项说明
参数 | 类型 | 默认值 | 说明 |
| string / VNode | — | 消息文字 |
| string |
| 主题,可选 |
| Component | — | 自定义图标组件 |
| boolean |
| 是否将 message 作为 HTML 片段处理 |
| number | 3000 | 显示时间,毫秒 |
| boolean |
| 是否显示关闭按钮 |
| boolean |
| 文字是否居中 |
| number | 20 | 距离窗口顶部的偏移量 |
| function | — | 关闭时的回调函数 |
4. 🔘 el-radio
单选组件
用于在多个选项中选择一个。
✅ el-radio
Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
| string / number / boolean | — | — | 绑定值 |
| string / number / boolean | — | — | Radio 的 value |
| boolean | — |
| 是否禁用 |
| boolean | — |
| 是否显示边框 |
| string |
| — | 尺寸 |
| string | — | — | 原生 name 属性 |
✅ el-radio-group
Props(用于包裹多个 radio)
参数 | 类型 | 可选值 | 默认值 | 说明 |
| string / number / boolean | — | — | 绑定值 |
| string |
| — | 尺寸 |
| boolean | — |
| 是否禁用 |
| string | — |
| 按钮形式的 Radio 激活时的文本颜色 |
| string | — |
| 按钮形式的 Radio 激活时的填充色和边框色 |
💡 使用说明
<template><!-- 基础单选 --><el-radio v-model="radio" label="1">选项A</el-radio><el-radio v-model="radio" label="2">选项B</el-radio><!-- 带边框 --><el-radio-group v-model="radio2"><el-radio label="1" border>选项A</el-radio><el-radio label="2" border disabled>选项B</el-radio></el-radio-group><!-- 按钮样式 --><el-radio-group v-model="radio3" size="large"><el-radio-button label="上海">上海</el-radio-button><el-radio-button label="北京">北京</el-radio-button><el-radio-button label="广州">广州</el-radio-button></el-radio-group>
</template><script setup>
import { ref } from 'vue'
const radio = ref('1')
const radio2 = ref('1')
const radio3 = ref('上海')
</script>
5. 🔽 el-select
选择器组件
下拉选择器,支持单选、多选、搜索、远程加载等。
✅ el-select
Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
| string / number / array | — | — | 绑定值 |
| boolean | — |
| 是否多选 |
| boolean | — |
| 是否禁用 |
| boolean | — |
| 是否可以清空选项 |
| boolean | — |
| 是否可搜索 |
| boolean | — |
| 是否允许用户创建新条目 |
| boolean | — |
| 是否正在从远程获取数据 |
| boolean | — |
| 是否为远程搜索 |
| function | — | — | 远程搜索方法 |
| string | — |
| 占位符 |
| string |
| — | 尺寸 |
| boolean | — |
| 多选时是否将选中值按文字的形式展示 |
| boolean | — |
| 多选时折叠的标签是否显示 tooltip |
✅ el-option
Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
| string / number / boolean | — | — | 选项的值 |
| string | — | — | 选项的标签,若不设置则默认与 value 相同 |
| boolean | — |
| 是否禁用该选项 |
💡 使用说明
<template><!-- 基础选择 --><el-select v-model="value" placeholder="请选择"><el-optionv-for="item in options":key="item.value":label="item.label":value="item.value"/></el-select><!-- 多选 --><el-select v-model="multipleValue" multiple placeholder="请选择"><el-optionv-for="item in options":key="item.value":label="item.label":value="item.value"/></el-select><!-- 远程搜索 --><el-selectv-model="remoteValue"multiplefilterableremotereserve-keywordplaceholder="请输入关键词":remote-method="remoteMethod":loading="loading"><el-optionv-for="item in remoteOptions":key="item.value":label="item.label":value="item.value"/></el-select>
</template><script setup>
import { ref } from 'vue'const value = ref('')
const multipleValue = ref([])
const remoteValue = ref([])
const loading = ref(false)
const remoteOptions = ref([])const options = [{ value: 'option1', label: '黄金糕' },{ value: 'option2', label: '双皮奶' },{ value: 'option3', label: '蚵仔煎' },
]const remoteMethod = (query) => {if (query !== '') {loading.value = truesetTimeout(() => {loading.value = falseremoteOptions.value = options.filter(item => item.label.toLowerCase().includes(query.toLowerCase()))}, 200)} else {remoteOptions.value = []}
}
</script>
6. 🔀 el-switch
开关组件
用于两种状态间的切换,如开启/关闭。
✅ Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
| boolean / string / number | — |
| 绑定值 |
| boolean | — |
| 是否禁用 |
| string / number | — |
| 宽度 |
| boolean | — |
| 是否在开关内显示文字 |
| Component | — | — | 自定义激活时的图标组件 |
| Component | — | — | 自定义未激活时的图标组件 |
| string | — | — | 激活时的文字 |
| string | — | — | 未激活时的文字 |
| string / number / boolean | — |
| 激活时的值 |
| string / number / boolean | — |
| 未激活时的值 |
| string | — |
| 激活时的背景色 |
| string | — |
| 未激活时的背景色 |
| string | — | — | 原生 name 属性 |
💡 使用说明
<template><el-switchv-model="value1"active-text="开"inactive-text="关"/><el-switchv-model="value2"class="ml-2"inline-promptactive-icon="Check"inactive-icon="Close"/><el-switchv-model="value3"class="ml-2"style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949"/>
</template><script setup>
import { ref } from 'vue'
import { Check, Close } from '@element-plus/icons-vue'const value1 = ref(true)
const value2 = ref(false)
const value3 = ref(true)
</script>
7. 📝 el-form
表单组件
表单容器,用于管理表单项的布局、校验和提交。
✅ el-form
Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
| object | — | — | 表单数据对象 |
| object | — | — | 表单验证规则 |
| boolean | — |
| 行内表单模式 |
| string |
|
| 标签的位置 |
| string / number | — | — | 标签的宽度 |
| string | — | — | 表单域标签的后缀 |
| boolean | — |
| 是否隐藏必填字段的标签旁边的红色星号 |
| string |
|
| 必填字段的星号位置 |
| boolean | — |
| 是否显示校验错误信息 |
| boolean | — |
| 是否以行内形式展示校验信息 |
| boolean | — |
| 是否在输入框中显示校验结果图标 |
| boolean | — |
| 是否禁用该表单内的所有组件 |
| boolean | — |
| 提交表单时,如果校验失败,是否自动滚动到第一个错误表单项 |
✅ el-form-item
Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
| string | — | — | 标签文本 |
| string / number | — | — | 标签的宽度 |
| string | — | — | 对应的 model 字段名,用于校验 |
| boolean | — |
| 是否必填 |
| object / array | — | — | 表单验证规则 |
| string | — | — | 表单域的错误信息,设置后会覆盖校验规则的错误信息 |
| boolean | — |
| 是否显示校验错误信息 |
| boolean | — |
| 是否以行内形式展示校验信息 |
| string |
| — | 尺寸 |
⚠️ 注意:el-form-item
必须设置 prop
属性才能进行校验。
💡 使用说明
<template><el-formref="ruleFormRef":model="form":rules="rules"label-width="120px"><el-form-item label="用户名" prop="username"><el-input v-model="form.username" /></el-form-item><el-form-item label="邮箱" prop="email"><el-input v-model="form.email" /></el-form-item><el-form-item label="年龄" prop="age"><el-input-number v-model="form.age" :min="1" :max="150" /></el-form-item><el-form-item><el-button type="primary" @click="submitForm(ruleFormRef)">提交</el-button><el-button @click="resetForm(ruleFormRef)">重置</el-button></el-form-item></el-form>
</template><script setup>
import { ref } from 'vue'
import { ElMessage } from 'element-plus'const ruleFormRef = ref()
const form = ref({username: '',email: '',age: 18,
})const rules = ref({username: [{ required: true, message: '请输入用户名', trigger: 'blur' },{ min: 3, max: 15, message: '长度在 3 到 15 个字符', trigger: 'blur' }],email: [{ required: true, message: '请输入邮箱地址', trigger: 'blur' },{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }],age: [{ required: true, message: '请输入年龄', trigger: 'blur' },{ type: 'number', message: '年龄必须为数字值', trigger: 'blur' }]
})const submitForm = async (formEl) => {if (!formEl) returntry {await formEl.validate()ElMessage.success('提交成功!')} catch (error) {console.log('校验失败', error)}
}const resetForm = (formEl) => {if (!formEl) returnformEl.resetFields()
}
</script>
8. 📊 el-table
表格组件
用于展示大量结构化数据。
✅ el-table
Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
| array | — | — | 显示的数据 |
| string / number | — | — | 表格高度 |
| string / number | — | — | 表格最大高度 |
| boolean | — |
| 是否为斑马纹 table |
| boolean | — |
| 是否带有纵向边框 |
| boolean | — |
| 列的宽度是否自撑开 |
| boolean | — |
| 是否显示表头 |
| boolean | — |
| 是否要高亮当前行 |
| string / number | — | — | 当前行的 key,只写属性 |
| string / function | — | — | 行的 className 的回调方法 |
| object / function | — | — | 行的 style 的回调方法 |
| string / function | — | — | 单元格的 className 的回调方法 |
| object / function | — | — | 单元格的 style 的回调方法 |
| string / function | — | — | 表头行的 className 的回调方法 |
| object / function | — | — | 表头行的 style 的回调方法 |
| string / function | — | — | 表头单元格的 className 的回调方法 |
| object / function | — | — | 表头单元格的 style 的回调方法 |
| string / function | — | — | 行数据的 Key,用来优化渲染 |
| string | — |
| 空数据时显示的文本内容 |
| boolean | — |
| 是否默认展开所有行 |
| array | — | — | 可以通过该属性设置展开的行,需要设置 row-key |
| object | — | — | 默认的排序列的 prop 和顺序 |
| string |
/ |
| tooltip 的 effect 属性 |
| boolean | — |
| 是否在表尾显示合计行 |
| string | — |
| 合计行第一列的文本 |
| function | — | — | 自定义的合计计算方法 |
| function | — | — | 合并行或列的计算方法 |
| boolean | — |
| 在多选表格中,当仅有部分行被选中时,点击表头的多选框是否选择所有项 |
| number | — |
| 展示树形数据时,树节点的缩进 |
| boolean | — |
| 是否懒加载子节点数据 |
| function | — | — | 加载子节点数据的函数 |
| object | — |
| 渲染嵌套数据的配置选项 |
✅ el-table-column
Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
| string |
| — | 列类型 |
| number / function | — | — | 如果 为 ,可以通过 index 属性设置行索引 |
| string | — | — | column 的 key,如果需要使用 filter-change 事件,则需此属性 |
| string | — | — | 显示的标题 |
| string | — | — | 对应列内容的字段名 |
| string / number | — | — | 对应列的宽度 |
| string / number | — | — | 对应列的最小宽度 |
| string / boolean |
| — | 列是否固定 |
| function | — | — | 列标题 Label 区域渲染使用的 Function |
| boolean / string |
|
| 对应列是否可以排序 |
| function | — | — | 对数据进行排序的时候使用的方法 |
| boolean | — |
| 对应列是否可以通过拖动改变宽度 |
| function | — | — | 用来格式化内容 |
| boolean | — |
| 当内容过长被隐藏时是否显示 tooltip |
| string |
|
| 对齐方式 |
| string |
| — | 表头对齐方式,若不设置,则继承 的值 |
| string | — | — | 列的 className |
| string | — | — | 当前列标题的自定义类名 |
| function | — | — | 仅对 的列有效,类型为 Function,Function 的返回值用来决定这一行的 checkbox 是否可以勾选 |
| boolean | — |
| 仅对 的列有效,类型为 Boolean,为 true 则会在数据更新之后保留之前选中的选项 |
| array | — | — | 数据筛选的选项,数组格式,数组中的元素需要有 text 和 value 属性 |
| string |
| — | 过滤弹出框的定位 |
| boolean | — |
| 数据筛选的选项是否多选 |
| function | — | — | 数据筛选使用的方法,如果是多选的筛选项,对每一条数据会执行多次,任意一次返回 就会显示 |
| array | — | — | 选中的数据筛选项,如果设置了这个值,列的筛选状态会受控于外部 |
⚠️ 注意:由于篇幅限制,el-table
的事件、方法和插槽未在此详述,但它们同样重要,如 @selection-change
、@sort-change
、@filter-change
等。
💡 使用说明
<template><el-table:data="tableData"style="width: 100%"height="400"borderstripe@selection-change="handleSelectionChange"><el-table-column type="selection" width="55" /><el-table-column type="index" width="60" /><el-table-column prop="name" label="姓名" width="120" /><el-table-column prop="age" label="年龄" width="100" sortable /><el-table-column prop="address" label="地址" show-overflow-tooltip /><el-table-column label="操作" width="180"><template #default="{ row }"><el-button size="small" @click="handleEdit(row)">编辑</el-button><el-button size="small" type="danger" @click="handleDelete(row)">删除</el-button></template></el-table-column></el-table>
</template><script setup>
import { ref } from 'vue'const tableData = ref([{ name: '张三', age: 25, address: '上海市普陀区金沙江路 1518 弄' },{ name: '李四', age: 30, address: '上海市普陀区金沙江路 1517 弄' },{ name: '王五', age: 28, address: '上海市普陀区金沙江路 1519 弄' }
])const multipleSelection = ref([])const handleSelectionChange = (val) => {multipleSelection.value = val
}const handleEdit = (row) => {console.log('编辑', row)
}const handleDelete = (row) => {console.log('删除', row)
}
</script>
9. 🍽️ el-menu
菜单组件
用于构建导航菜单。
✅ el-menu
Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
| string |
|
| 菜单模式 |
| boolean | — |
| 是否水平折叠收起菜单 |
| string | — |
| 菜单的背景色 |
| string | — |
| 菜单的文字颜色 |
| string | — |
| 菜单激活时的文字颜色 |
| string | — | — | 当前激活菜单的 index |
| array | — | — | 当前打开的 sub-menu 的 index 的数组 |
| boolean | — |
| 是否只保持一个子菜单的展开 |
| string |
|
| 子菜单打开的触发方式 |
| boolean | — |
| 是否使用 vue-router 的模式,启用该模式会在激活导航时以 index 作为 path 进行路由跳转 |
| boolean | — |
| 是否开启折叠动画 |
✅ el-menu-item
Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
| string | — | — | 唯一标志 |
| object / string | — | — | Vue Router 路径对象或字符串 |
| boolean | — |
| 是否禁用 |
✅ el-sub-menu
Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
| string | — | — | 唯一标志 |
| string | — | — | 弹出菜单的自定义类名 |
| number | — |
| 弹出菜单和父菜单的距离 |
| boolean | — |
| 是否将弹出菜单放置于 body 内 |
💡 使用说明
<template><el-menu:default-active="activeIndex"class="el-menu-demo"mode="horizontal"@select="handleSelect"><el-menu-item index="1">处理中心</el-menu-item><el-sub-menu index="2"><template #title>我的工作台</template><el-menu-item index="2-1">选项1</el-menu-item><el-menu-item index="2-2">选项2</el-menu-item><el-menu-item index="2-3">选项3</el-menu-item></el-sub-menu><el-menu-item index="3" disabled>消息中心</el-menu-item><el-menu-item index="4">订单管理</el-menu-item></el-menu>
</template><script setup>
import { ref } from 'vue'const activeIndex = ref('1')const handleSelect = (key, keyPath) => {console.log(key, keyPath)
}
</script>
10. 🧱 el-layout
布局组件
用于构建页面整体布局。
✅ el-container
Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
| string |
| — | 子元素的排列方向 |
✅ el-header
Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
| string | — |
| 顶栏高度 |
✅ el-aside
Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
| string | — |
| 侧边栏宽度 |
✅ el-main
Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
— | — | — | — | 无特殊参数 |
✅ el-footer
Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
| string | — |
| 底栏高度 |
💡 使用说明
<template><el-container style="height: 100vh;"><el-aside width="200px"><el-menudefault-active="1"class="el-menu-vertical-demo"@open="handleOpen"@close="handleClose"><el-menu-item index="1"><el-icon><Location /></el-icon><span>导航一</span></el-menu-item><el-menu-item index="2"><el-icon><Menu /></el-icon><span>导航二</span></el-menu-item></el-menu></el-aside><el-container><el-header>Header</el-header><el-main>Main Content</el-main><el-footer>Footer</el-footer></el-container></el-container>
</template><script setup>
import { Location, Menu } from '@element-plus/icons-vue'
const handleOpen = (key, keyPath) => {console.log(key, keyPath)
}
const handleClose = (key, keyPath) => {console.log(key, keyPath)
}
</script>
11. 📦 el-container
组件
已在 el-layout
部分介绍。
12. 🎠 el-carousel
轮播图组件
用于实现图片或内容的轮播展示。
✅ el-carousel
Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
| string | — | — | 轮播图的高度 |
| number | — |
| 初始显示的索引 |
| string |
|
| 指示器的触发方式 |
| boolean | — |
| 是否自动切换 |
| number | — |
| 自动切换的时间间隔,单位为毫秒 |
| string |
| — | 指示器的位置 |
| string |
|
| 切换箭头的显示时机 |
| string |
/ — | — | 走马灯的类型 |
| boolean | — |
| 是否循环显示 |
| string |
|
| 滚动方向 |
✅ el-carousel-item
Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
— | — | — | — | 无特殊参数 |
💡 使用说明
<template><el-carousel height="200px"><el-carousel-item v-for="item in 4" :key="item"><h3 class="small justify-center">{{ item }}</h3></el-carousel-item></el-carousel>
</template><style>
.el-carousel__item h3 {color: #475669;opacity: 0.75;line-height: 200px;margin: 0;text-align: center;
}.el-carousel__item:nth-child(2n) {background-color: #99a9bf;
}.el-carousel__item:nth-child(2n + 1) {background-color: #d3dce6;
}
</style>
13. 📜 el-scrollbar
滚动条组件
el-scrollbar
是一个自定义滚动条组件,用于替代浏览器原生的滚动条,提供更美观、更可控的滚动体验。它特别适用于需要在固定高度或宽度的容器内展示大量内容的场景。
✅ Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
| string / number | — | — | 设置滚动条容器的高度 |
| string / number | — | — | 设置滚动条容器的最大高度 |
| boolean | — |
| 是否使用原生滚动条,如果为 |
| object / string | — | — | 外层容器 |
| string / object / array | — | — | 外层容器 |
| string / object / array | — | — | 内容视图 |
| object / string | — | — | 内容视图 |
| boolean | — |
| 防止 |
| string | — |
| 视图的元素标签名 |
| boolean | — |
| 是否总是显示滚动条 |
✅ 事件 (Events)
事件名 | 说明 | 回调参数 |
| 滚动时触发 |
|
✅ 方法 (Methods)
方法名 | 说明 | 参数 |
| 手动触发滚动事件 | — |
| 将内容滚动到指定的位置 |
|
| 获取当前滚动的垂直位置 | — |
| 设置垂直滚动位置 |
|
| 获取当前滚动的水平位置 | — |
| 设置水平滚动位置 |
|
💡 使用说明与示例
el-scrollbar
组件非常适合用于创建自定义的滚动区域,比如侧边栏菜单、对话框内容区、代码预览窗格等。
<template><div class="scrollbar-container"><!-- 基础垂直滚动条 --><el-scrollbar height="200px"><p v-for="item in 20" :key="item" class="scrollbar-demo-item">{{ item }}</p></el-scrollbar><!-- 带有自定义样式的滚动条 --><el-scrollbar height="200px" :wrap-style="{ 'background': 'rgb(235, 235, 235)' }":always="true"><p v-for="item in 20" :key="item" class="scrollbar-demo-item">{{ item }}</p></el-scrollbar><!-- 水平和垂直滚动条 --><el-scrollbar height="200px" style="width: 300px;"><div style="width: 800px; white-space: nowrap;"><span v-for="item in 50" :key="item" class="scrollbar-demo-item" style="display: inline-block;">{{ item }}</span></div></el-scrollbar><!-- 监听滚动事件 --><el-scrollbar height="200px" @scroll="onScroll"><p v-for="item in 30" :key="item" class="scrollbar-demo-item">监听滚动 - {{ item }}</p></el-scrollbar><p>滚动位置: {{ scrollPosition }}</p><!-- 使用方法控制滚动 --><el-scrollbar ref="scrollbarRef" height="200px"><p v-for="item in 50" :key="item" class="scrollbar-demo-item">可编程控制 - {{ item }}</p></el-scrollbar><div class="control-buttons"><el-button @click="scrollToTop">滚动到顶部</el-button><el-button @click="scrollToBottom">滚动到底部</el-button><el-button @click="scrollToPosition">滚动到位置 1000</el-button></div></div>
</template><script setup>
import { ref } from 'vue'
import { ElScrollbar, ElButton } from 'element-plus'const scrollPosition = ref({ scrollLeft: 0, scrollTop: 0 })
const scrollbarRef = ref()const onScroll = (scroll) => {scrollPosition.value = scroll
}const scrollToTop = () => {scrollbarRef.value?.setScrollTop(0)
}const scrollToBottom = () => {// 获取内容总高度并滚动到底部const wrapElement = scrollbarRef.value?.wrap$ if (wrapElement) {scrollbarRef.value?.setScrollTop(wrapElement.scrollHeight - wrapElement.clientHeight)}
}const scrollToPosition = () => {scrollbarRef.value?.setScrollTop(1000)
}
</script><style scoped>
.scrollbar-container {display: flex;flex-direction: column;gap: 20px;padding: 20px;
}.scrollbar-demo-item {display: flex;align-items: center;justify-content: center;height: 50px;margin: 10px;text-align: center;border-radius: 4px;background: var(--el-color-primary-light-9);color: var(--el-color-primary);
}.control-buttons {margin-top: 10px;display: flex;gap: 10px;
}
</style>
🎯 应用场景
- 固定高度内容区域:当需要在一个固定大小的容器内展示可能超出其范围的内容时,如侧边栏、弹窗内容、列表预览等。
- 美化滚动体验:原生滚动条在不同操作系统上样式不一,且可能占用过多空间。
el-scrollbar
提供了更精致、更一致的视觉效果。 - 精确控制滚动:通过其提供的方法,可以精确控制滚动位置,实现平滑滚动、锚点跳转等高级功能。
- 性能优化:在某些情况下,使用虚拟滚动结合
el-scrollbar
可以优化大量数据的渲染性能。
⚠️ 注意事项
- 性能:虽然
el-scrollbar
提供了更好的视觉体验,但它是一个 JavaScript 实现的组件,对于非常长的列表,可能会比原生滚动条消耗更多性能。在极端情况下,考虑使用native="true"
或虚拟滚动技术。 - 触摸设备:确保在移动设备上的触摸滚动体验是流畅的。
- 样式覆盖:可以通过
wrap-class
、view-class
等属性或深度选择器来自定义滚动条的外观。
14. 💬 el-tooltip
文字提示组件
el-tooltip
组件用于当目标元素的文本内容过长被省略时,鼠标悬停时显示完整内容,或者用于对某个元素进行简短说明。
✅ Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
| boolean | — | — | 状态是否可见 |
| string | — | — | 显示的内容,也可以通过 |
| string |
/ |
| 出现位置 |
| boolean | — | — | 清除时的值 |
| boolean | — |
| 是否禁用 |
| number | — | 0 | 出现位置的偏移量 |
| string | — |
| 定义渐变动画 |
| boolean | — |
| 是否显示箭头 |
| object | — |
| popper.js 参数 |
| number | — | 0 | 出现之前的延迟(毫秒),仅在 |
| number | — | 200 | 消失之前的延迟(毫秒),仅在 |
| number / string | — | 0 | tooltip 的 |
| number | — | 0 | 显示延迟,单位毫秒 |
| number | — | 0 | 关闭延迟,单位毫秒 |
| number | — | 0 | 点击后自动关闭延时,单位毫秒 |
| boolean | — |
| 是否手动控制状态, 则不会自动显示隐藏 |
| string |
|
| 默认提供的主题 |
| boolean | — |
| 鼠标是否可以进入 tooltip |
| boolean | — |
| 是否在点击后隐藏 |
| string | — | — | 为 popper 添加类名,可用于自定义样式 |
| object | — | — | 为 popper 添加内联样式 |
| string |
|
| 触发方式 |
| object | — | — | 虚拟元素的 ref,用于与其引用的元素进行交互 |
| boolean | — |
| 是否触发虚拟元素事件 |
| boolean | — |
| tooltip 是否会被插入到 元素上 |
| boolean | — |
| tooltip 是否会对 进行响应 |
✅ 事件 (Events)
事件名 | 说明 | 回调参数 |
| tooltip 显示时触发 | — |
| tooltip 隐藏时触发 | — |
✅ Slots
插槽名 | 说明 |
| 内容,也可以使用 |
| 内容,当需要传入 DOM 时使用 |
💡 使用说明与示例
el-tooltip
是提升用户体验的重要组件,常用于按钮、表格单元格、标签等元素的说明。
<template><div class="tooltip-container"><!-- 基础用法 --><el-tooltip content="这是一段提示文字" placement="top"><el-button>顶部显示</el-button></el-tooltip><el-tooltip content="这是一段提示文字" placement="bottom"><el-button>底部显示</el-button></el-tooltip><el-tooltip content="这是一段提示文字" placement="left"><el-button>左侧显示</el-button></el-tooltip><el-tooltip content="这是一段提示文字" placement="right"><el-button>右侧显示</el-button></el-tooltip><!-- 主题与效果 --><el-tooltip content="深色主题" effect="dark"><el-button>深色</el-button></el-tooltip><el-tooltip content="浅色主题" effect="light"><el-button>浅色</el-button></el-tooltip><!-- 延迟显示与关闭 --><el-tooltip content="延迟显示" :open-delay="500" :close-delay="300"><el-button>延迟显示</el-button></el-tooltip><!-- 点击触发 --><el-tooltip content="点击显示提示" trigger="click"><el-button>点击触发</el-button></el-tooltip><!-- 手动控制 --><el-tooltip v-model="visible" content="手动控制的提示" :manual="true" placement="top"><template #content><span>这是 <b>加粗</b> 的提示内容</span></template><el-button @click="visible = !visible">手动控制</el-button></el-tooltip><!-- 复杂内容 --><el-tooltip placement="top"><template #content><div>多行内容</div><div><el-tag size="small">标签</el-tag></div></template><el-button>复杂内容</el-button></el-tooltip><!-- 禁用状态 --><el-tooltip content="禁用的提示" disabled><el-button disabled>禁用按钮</el-button></el-tooltip></div>
</template><script setup>
import { ref } from 'vue'
import { ElTooltip, ElButton, ElTag } from 'element-plus'const visible = ref(false)
</script><style scoped>
.tooltip-container {display: flex;flex-wrap: wrap;gap: 10px;padding: 20px;
}
</style>
🎯 应用场景
- 按钮说明:为功能图标或简短按钮文字提供详细说明。
- 表格内容溢出:当表格单元格内容过长被截断时,鼠标悬停显示完整内容。
- 表单验证提示:在输入框旁边提供格式或要求的提示。
- 导航菜单:在侧边栏图标菜单中,鼠标悬停显示菜单名称。
- 状态说明:对某些状态标签或徽章提供更详细的解释。
⚠️ 注意事项
- 内容长度:避免在 tooltip 中放置过多内容,通常应保持简短。
- 可访问性:确保 tooltip 内容对屏幕阅读器等辅助技术是可访问的。
- 触发方式:根据使用场景选择合适的触发方式(hover, click, focus)。
- 移动端:在触摸设备上,hover 触发可能不理想,考虑使用 click 触发。
15. 🔽 el-collapse
折叠面板组件
el-collapse
组件用于实现内容的折叠与展开,可以有效节省页面空间,让用户按需查看信息。
✅ Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
| array / string | — | — | 当前激活的面板的 |
| boolean | — |
| 是否启用手风琴模式,即每次只允许展开一个面板 |
✅ 事件 (Events)
事件名 | 说明 | 回调参数 |
| 激活面板时触发 |
|
| 激活面板时触发(与 |
|
✅ 插槽 (Slots)
插槽名 | 说明 | 子组件 |
| 默认插槽,用于放置 |
|
✅ el-collapse-item
Props
参数 | 类型 | 可选值 | 默认值 | 说明 |
| string / number | — | — | 唯一标志符, |
| string | — | — | 面板标题 |
| boolean | — |
| 是否禁用 |
💡 使用说明与示例
el-collapse
是组织分组信息的理想选择,常用于 FAQ、配置面板、详情页等。
<template><div class="collapse-container"><!-- 基础折叠面板 --><el-collapse v-model="activeNames" @change="handleChange"><el-collapse-item name="1"><template #title>一致性 Consistency<i class="header-icon el-icon-info"></i></template><div>与现实生活一致:与现实生活的流程、逻辑保持一致,遵循用户习惯的语言和概念;</div><div>在界面中一致:所有的元素和结构需保持一致,比如:设计样式、图标和文本、元素的位置等。</div></el-collapse-item><el-collapse-item name="2"><template #title>反馈 Feedback</template><div>控制反馈:通过界面样式和交互动效让用户可以清晰的感知自己的操作;</div><div>页面反馈:页面操作后,告知用户操作成功。</div></el-collapse-item><el-collapse-item name="3" disabled><template #title>效率 Efficiency</template><div>简化流程:设计简洁直观的操作流程;</div><div>清晰明确:语言表达清晰且表意明确,让用户快速理解进而作出决策;</div><div>帮助用户识别:界面简单直白,让用户快速识别而非回忆,减少用户记忆负担。</div></el-collapse-item><el-collapse-item name="4"><template #title>可控 Controllability</template><div>用户决策:根据场景可给予用户操作建议或安全提示,但不能代替用户进行决策;</div><div>权限:尊重用户的选择,包括取消操作的权利。</div></el-collapse-item></el-collapse><!-- 手风琴模式 --><h3>手风琴模式</h3><el-collapse v-model="activeName" accordion><el-collapse-item name="1"><template #title>一致性 Consistency<i class="header-icon el-icon-info"></i></template><div>与现实生活一致:与现实生活的流程、逻辑保持一致,遵循用户习惯的语言和概念;</div><div>在界面中一致:所有的元素和结构需保持一致,比如:设计样式、图标和文本、元素的位置等。</div></el-collapse-item><el-collapse-item name="2"><template #title>反馈 Feedback</template><div>控制反馈:通过界面样式和交互动效让用户可以清晰的感知自己的操作;</div><div>页面反馈:页面操作后,告知用户操作成功。</div></el-collapse-item><el-collapse-item name="3"><template #title>效率 Efficiency</template><div>简化流程:设计简洁直观的操作流程;</div><div>清晰明确:语言表达清晰且表意明确,让用户快速理解进而作出决策;</div><div>帮助用户识别:界面简单直白,让用户快速识别而非回忆,减少用户记忆负担。</div></el-collapse-item><el-collapse-item name="4"><template #title>可控 Controllability</template><div>用户决策:根据场景可给予用户操作建议或安全提示,但不能代替用户进行决策;</div><div>权限:尊重用户的选择,包括取消操作的权利。</div></el-collapse-item></el-collapse><!-- 动态控制 --><div class="control-section"><el-button @click="toggleAll">切换所有面板</el-button><el-button @click="expandFirst">展开第一个</el-button><el-button @click="collapseAll">收起所有</el-button></div></div>
</template><script setup>
import { ref } from 'vue'
import { ElCollapse, ElCollapseItem, ElButton } from 'element-plus'const activeNames = ref(['1'])
const activeName = ref('1')const handleChange = (val) => {console.log('Collapse changed:', val)
}const toggleAll = () => {if (activeNames.value.length === 0) {activeNames.value = ['1', '2', '4'] // 排除禁用的项} else {activeNames.value = []}
}const expandFirst = () => {activeNames.value = ['1']
}const collapseAll = () => {activeNames.value = []
}
</script><style scoped>
.collapse-container {padding: 20px;
}.collapse-container h3 {margin: 20px 0 10px 0;font-weight: normal;color: #666;
}.header-icon {margin-left: 5px;color: #999;
}.control-section {margin-top: 20px;display: flex;gap: 10px;
}
</style>
🎯 应用场景
- FAQ 页面:常见问题解答,用户点击问题展开查看答案。
- 配置面板:将复杂的配置项分组折叠,用户按需展开设置。
- 详情页:在商品详情、用户详情等页面中,将次要信息折叠。
- 表单分组:在长表单中,将相关字段分组并可折叠。
- 文档/帮助中心:组织层级化的帮助文档。
⚠️ 注意事项
- 内容组织:合理划分折叠项,确保每个面板内的内容主题明确。
- 默认展开:根据用户最可能查看的内容,合理设置默认展开的面板。
- 手风琴模式:当信息具有互斥性或需要用户逐项查看时,使用手风琴模式。
- 性能:对于包含大量动态内容的折叠面板,考虑懒加载或条件渲染以优化性能。