欢迎光临
我们一直在努力

【Vue】Element-Plus快速入门 && Form && Card && Table && Tree && Dialog && Menu

文章目录

  • Ⅰ. 基本介绍
    • 一、什么是组件
    • 二、什么是ElementPlus组件库
    • 其他组件
  • Ⅱ. 快速入门
    • 一、安装
    • 二、完整引入
    • 三、测试
  • Ⅲ. 学习ElementPlus常用组件
    • 一、Form表单组件
      • 1. 介绍
      • 2. 基本使用
      • 3. 表单校验
      • 案例
    • 二、Card卡片组件
    • 三、Table表格组件
      • 1. 介绍
      • 2. 基础用法
      • 3. 自定义列模版
    • 四、Tree树形组件
      • 1. 介绍
      • 2. 基础用法
      • 3. 自定义节点内容
    • 五、Dialog弹框组件
    • 六、Menu菜单组件
      • 1. 介绍
      • 2. 基础用法
      • 3. 示例代码

在这里插入图片描述

Ⅰ. 基本介绍

一、什么是组件

一个可复用的Vue实例、一段独立的 UI 界面,有自己的 HTML + CSS + JavaScript,代码上体现在一个独立的 .vue 文件。

<script setup></script>
<template></template>
<style lang="scss" scoped></style>

二、什么是ElementPlus组件库

官方文档

ElementPlus 是由饿了么团队开发的。是一个基于 Vue3 开发PC端开源UI组件库,专为开发者提供了一套优雅而灵活的UI组件。它包含了各种常用的Web组件,如按钮、表单、导航等;以及高级组件,如日期选择器、对话框等。ElementPlus 默认语言环境是中文,但可以通过指定 locale 属性来实现其他语言环境,如英文。总之,ElementPlus 提供了丰富的PC组件,有效地降低了开发难度。

组件分类:

  • 基础组件
  • 表单组件
  • 数据展示
  • 导航组件
  • 反馈组件
  • 其他组件

Ⅱ. 快速入门

一、安装

npm i element-plus

二、完整引入

// 导入 ElementPlus 组件
import ElementPlus from 'element-plus'
// 导入组件样式
import 'element-plus/dist/index.css'

// 全局注册所有组件
app.use(ElementPlus)

三、测试

以 Button 组件为例,在 App.vue 中测试:

<elbutton>Default</elbutton>
<elbutton type="primary">Primary</elbutton>
<elbutton type="success">Success</elbutton>
<elbutton type="info">Info</elbutton>
<elbutton type="warning">Warning</elbutton>
<elbutton type="danger">Danger</elbutton>

Ⅲ. 学习ElementPlus常用组件

一、Form表单组件

https://element-plus.org/zh-CN/component/form.html

1. 介绍

表单包含 输入框,单选框,下拉选择,多选框 等用户输入的组件。使用表单可以收集、验证和提交数据。

在这里插入图片描述

2. 基本使用

  • 创建一个表单对象 form,写上需要双向绑定到组件上的字段
  • 在 <el-form> 表单组件中通过 :model 绑定表单对象 form
  • 在 <el-form-item> 中的各个子组件比如 <el-input> 中通过 v-model 绑定表单对象中要双向绑定的元素,比如 form.name

<script setup>
import { reactive } from 'vue'

// 表单对象
const form = reactive({
name: '',
region: '',
date1: '',
date2: '',
delivery: false,
type: [],
resource: '',
desc: ''
})

// 提交
const onSubmit = () => {
console.log('submit!')
}
</script>

<template>
<!
model: 表单数据对象
labelwidth: 标签的宽度,可使用 auto
style: 行内样式
>
<elform
:model="form"
labelwidth="auto"
style="max-width: 600px">

<! label: 标签文本 >
<elformitem label="Activity name">
<! vmodel: 双向绑定,收集或设置表单数据 >
<elinput vmodel="form.name" />
</elformitem>

<elformitem label="Activity zone">
<!
下拉列表
placeholder: 占位提示文本
>
<elselect
vmodel="form.region"
placeholder="please select your zone">
<!
选项
label: 展示的文本
value: 同步到vmodel的值
>
<eloption
label="Zone one"
value="shanghai" />
<eloption
label="Zone two"
value="beijing" />
</elselect>
</elformitem>

<elformitem label="Activity time">
<! 列 span: 占据的宽度份数,一行分为24>
<elcol :span="11">
<! 日期选择器 >
<eldatepicker
vmodel="form.date1"
type="date"
placeholder="Pick a date"
style="width: 100%" />
</elcol>
<elcol
:span="2"
class="text-center">
<span class="text-gray-500"></span>
</elcol>
<elcol :span="11">
<! 时间选择器 >
<eltimepicker
vmodel="form.date2"
placeholder="Pick a time"
style="width: 100%" />
</elcol>
</elformitem>

<elformitem label="Instant delivery">
<! 开关 >
<elswitch vmodel="form.delivery" />
</elformitem>

<elformitem label="Activity type">
<! 复选框组 >
<elcheckboxgroup vmodel="form.type">
<elcheckbox
value="Online activities"
name="type">
Online activities
</elcheckbox>
<elcheckbox
value="Promotion activities"
name="type">
Promotion activities
</elcheckbox>
<elcheckbox
value="Offline activities"
name="type">
Offline activities
</elcheckbox>
<elcheckbox
value="Simple brand exposure"
name="type">
Simple brand exposure
</elcheckbox>
</elcheckboxgroup>
</elformitem>

<elformitem label="Resources">
<! 单选框组 >
<elradiogroup vmodel="form.resource">
<elradio value="Sponsor">Sponsor</elradio>
<elradio value="Venue">Venue</elradio>
</elradiogroup>
</elformitem>

<elformitem label="Activity form">
<elinput
vmodel="form.desc"
type="textarea" />
</elformitem>

<elformitem>
<! 提交按钮 >
<elbutton
type="primary"
@click="onSubmit"
> Create </elbutton>
<! 取消按钮 >
<elbutton>Cancel</elbutton>
</elformitem>
</elform>
</template>

3. 表单校验

Form 组件允许你验证用户的输入是否符合规范,来帮助找到和纠正错误。

Form 组件提供了表单验证的功能,只需为 rules 属性传入约定的验证规则,并将 form-item 的 prop 属性设置为需要验证的特殊键值即可。

下面是常见的规则属性:

规则属性类型说明示例
required boolean 是否必填 { required: true, message: ‘请输入用户名’ }
min number 字符串最小长度 / 数值最小值 { min: 3, message: ‘至少3个字符’ }
max number 字符串最大长度 / 数值最大值 { max: 10, message: ‘最多10个字符’ }
type string 限制字段类型,可选值:string、number、boolean、method、regexp、integer、float、array、object、enum、date、url、hex、email { type: ‘email’, message: ‘请输入合法邮箱’ }
pattern RegExp 自定义正则校验 { pattern: /1{6}$/, message: ‘请输入6位数字’ }
len number 字符串精确长度 / 数组精确长度 { len: 6, message: ‘必须输入6个字符’ }
enum string[] 枚举值范围 { type: ‘enum’, enum: [‘A’, ‘B’], message: ‘只能选择 A 或 B’ }
whitespace boolean 是否允许输入空格 { required: true, whitespace: true, message: ‘内容不能为空’ }
validator (rule, value, callback) => void | Promise 自定义函数校验,最灵活 { validator: (rule, value) => value === ‘admin’, message: ‘必须是 admin’ }
trigger string | string[] 触发方式,blur 或 change,也可数组形式 { required: true, trigger: [‘blur’, ‘change’] }

<script setup>
import { reactive, ref } from 'vue'

const formRef = ref(null)

// 表单对象
const form = reactive({
name: '',
region: '',
date1: '',
date2: '',
delivery: false,
type: [],
resource: '',
desc: ''
})

// 校验规则
const rules = {
name: [
{
required: true,
message: 'Please input Activity name',
trigger: 'blur'
},
{ min: 3, max: 5, message: 'Length should be 3 to 5', trigger: 'blur' }
],
region: [
{
required: true,
message: 'Please select Activity zone',
trigger: 'change'
}
],
count: [
{
required: true,
message: 'Please select Activity count',
trigger: 'change'
}
],
date1: [
{
type: 'date',
required: true,
message: 'Please pick a date',
trigger: 'change'
}
],
date2: [
{
type: 'date',
required: true,
message: 'Please pick a time',
trigger: 'change'
}
],
location: [
{
required: true,
message: 'Please select a location',
trigger: 'change'
}
],
type: [
{
type: 'array',
required: true,
message: 'Please select at least one activity type',
trigger: 'change'
}
],
resource: [
{
required: true,
message: 'Please select activity resource',
trigger: 'change'
}
],
desc: [
{ required: true, message: 'Please input activity form', trigger: 'blur' }
]
}

// 提交
const submitForm = async () => {
// 对整个表单进行验证。
formRef.value.validate((valid) => {
if (valid) {
console.log('submit!')
} else {
console.log('error submit!')
}
})
}

// 重置
const resetForm = () => {
// 重置该表单项,将其值重置为初始值,并移除校验结果
formRef.value.resetFields()
}
</script>

<template>
<!
rules: 校验规则
ref: 用来调用 Form 提供的方法
>
<elform
style="max-width: 600px"
:model="form"
:rules="rules"
ref="formRef"
labelwidth="auto"
statusicon>
<!
prop: 校验的字段
>
<elformitem
label="Activity name"
prop="name">
<elinput vmodel="form.name" />
</elformitem>
<elformitem
label="Activity zone"
prop="region">
<elselect
vmodel="form.region"
placeholder="Activity zone">
<eloption
label="Zone one"
value="shanghai" />
<eloption
label="Zone two"
value="beijing" />
</elselect>
</elformitem>
<elformitem
label="Activity time"
required>
<elcol :span="11">
<elformitem prop="date1">
<eldatepicker
vmodel="form.date1"
type="date"
arialabel="Pick a date"
placeholder="Pick a date"
style="width: 100%" />
</elformitem>
</elcol>
<elcol
class="text-center"
:span="2">
<span class="text-gray-500"></span>
</elcol>
<elcol :span="11">
<elformitem prop="date2">
<eltimepicker
vmodel="form.date2"
arialabel="Pick a time"
placeholder="Pick a time"
style="width: 100%" />
</elformitem>
</elcol>
</elformitem>
<elformitem
label="Instant delivery"
prop="delivery">
<elswitch vmodel="form.delivery" />
</elformitem>
<elformitem
label="Activity type"
prop="type">
<elcheckboxgroup vmodel="form.type">
<elcheckbox
value="Online activities"
name="type">
Online activities
</elcheckbox>
<elcheckbox
value="Promotion activities"
name="type">
Promotion activities
</elcheckbox>
<elcheckbox
value="Offline activities"
name="type">
Offline activities
</elcheckbox>
<elcheckbox
value="Simple brand exposure"
name="type">
Simple brand exposure
</elcheckbox>
</elcheckboxgroup>
</elformitem>
<elformitem
label="Resources"
prop="resource">
<elradiogroup vmodel="form.resource">
<elradio value="Sponsorship">Sponsorship</elradio>
<elradio value="Venue">Venue</elradio>
</elradiogroup>
</elformitem>
<elformitem
label="Activity form"
prop="desc">
<elinput
vmodel="form.desc"
type="textarea" />
</elformitem>
<elformitem>
<elbutton
type="primary"
@click="submitForm">
Create
</elbutton>
<elbutton @click="resetForm">Reset</elbutton>
</elformitem>
</elform>
</template>

案例

在这里插入图片描述

  • 用户名:必填项、长度3-10个字符、失焦做校验
  • 密码:必填项、长度6-15个字符、失焦做校验
  • 输入框前面带上图标
  • 点击登录时做整体校验
  • 点击取消按钮进行重置

<script setup>
import { reactive, ref } from 'vue';
import { ElMessage } from 'element-plus'

const loginForm = reactive({
name: '',
password: '',
})

const rules = {
name: [
{ required: true, message: '请输入用户名', trigger: 'blur' },
{ min: 3, max: 10, message: '长度范围:3-10个字符', trigger: 'blur'}
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' },
{ min: 6, max: 15, message: '长度范围:6-15个字符', trigger: 'blur'}
]
}

const loginFormRef = ref(null) // 拿到表单组件的引用

const onSubmit = () => {
loginFormRef.value.validate((isValid) => {
if(isValid === false) {
return ElMessage.error('请进行合法输入!')
}
})
console.log('ok…进行网络请求…');
}

const onReset = () => {
loginFormRef.value.resetFields()
}
</script>

<template>
<div class="login">
<elform
:model="loginForm"
:rules="rules"
ref="loginFormRef"
labelwidth="auto"
style="max-width: 300px"
>
<elformitem label="用户名" prop="name">
<elinput
vmodel="loginForm.name"
placeholder="请输入用户名"
prefixicon="User"
/>
</elformitem>

<elformitem label="密码" prop="password">
<elinput
vmodel="loginForm.password"
type="password"
showpassword
placeholder="请输入密码"
prefixicon="Lock"
/>
</elformitem>

<elformitem>
<elbutton type="primary" @click="onSubmit">提 交</elbutton>
<elbutton @click="onReset">重 置</elbutton>
</elformitem>
</elform>
</div>
</template>

<style>
body {
background: #ddd;
display: flex;
justifycontent: center; /* 登录框水平居中 */
alignitems: center; /* 登录框垂直居中 */
minheight: 100vh; /* 撑满屏幕高度 */
margin: 0;
}

.login {
width: 350px;
background: white;
padding: 20px 10px;
borderradius: 6px;

display: flex;
flexdirection: column; /* 子元素纵向排列 */
alignitems: center; /* 子元素水平居中 */
}
</style>

二、Card卡片组件

卡片包含标题,内容以及操作区域。

Card 组件使用 <el-card> 标识,并且由 header、body 和 footer组成。 其中 header 和 footer 是可选的,其内容取决于一个具名的 slot。

<template>
<div>
<elcard style="max-width: 300px" shadow="hover">
<template #header>
<div class="card-header">
<span>Card name</span>
</div>
</template>
<p vfor="o in 4" :key="o" class="text item">{{ 'List item ' + o }}</p>
<template #footer>Footer content</template>
</elcard>
</div>
</template>

三、Table表格组件

1. 介绍

表格组件用于展示多条结构类似的数据,可对数据进行排序、筛选、对比或其他自定义操作。

2. 基础用法

当 <el-table> 元素中注入 data 对象数组后,在 <el-table-column> 中用 prop 属性来对应对象中的键名即可填入数据,用 label 属性来定义表格的列名。可以使用 width 属性来定义列宽。

<script setup>
const tableData = [
{
date: '2016-05-03',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles'
},
{
date: '2016-05-02',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles'
},
{
date: '2016-05-04',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles'
},
{
date: '2016-05-01',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles'
}
]
</script>

<template>
<!
data: 数据源
stripe: 带有斑马纹
border: 带边框
>
<eltable
:data="tableData"
style="width: 700px"
stripe
border
>
<!
tablecolumn:
label: 列名
prop: 渲染的字段名
width: 列宽
>
<eltablecolumn prop="date" label="日期" width="180" />
<eltablecolumn prop="name" label="名称" width="180" />
<eltablecolumn prop="address" label="地址" />
</eltable>
</template>

3. 自定义列模版

自定义列的显示内容,可组合其他组件使用。

通过作用域插槽,可以获取到 row, column, $index 和 store(table 内部的状态管理)的数据,从而实现表格内容的自定义渲染。

比如下图需要对 “名称” 以及 “操作” 列表进行自定义,而不只是通过 <el-table-column> 中的 prop 属性直接导入对应的数据,这时候就需要使用作用域插槽!

在这里插入图片描述

<template>
<div>
<eltable
:data="tableData"
style="width: 100%"
stripe
border
>
<eltablecolumn type="selection" width="55" />
<eltablecolumn prop="date" label="日期" width="180" />
<eltablecolumn label="名称" width="180">
<template #default="obj">
<eltag type="success">{{ obj.row.name }}</eltag>
</template>
</eltablecolumn>
<eltablecolumn prop="address" label="地址" />
<eltablecolumn label="操作">
<template #default>
<elicon><Edit /></elicon>
<elicon><Delete /></elicon>
</template>
</eltablecolumn>
</eltable>
</div>
</template>

<script setup>
const tableData = [
{
date: '2016-05-03',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles'
},
{
date: '2016-05-02',
name: 'liren',
address: 'No. 189, Grove St, Los Angeles'
},
{
date: '2016-05-04',
name: 'jack',
address: 'No. 189, Grove St, Los Angeles'
},
{
date: '2016-05-01',
name: 'Tom2',
address: 'No. 189, Grove St, Los Angeles'
}
]
</script>

四、Tree树形组件

1. 介绍

用清晰的层级结构展示信息,可展开或折叠。

在这里插入图片描述

2. 基础用法

使用 <el-tree> 标签,配合各种属性以及数据源,可以搭建对应的树。

<script setup>
const handleNodeClick = (data) => {
console.log(data)
}

const data = [
{
label: 'Level one 1',
children: [
{
label: 'Level two 1-1',
children: [
{
label: 'Level three 1-1-1',
},
],
},
],
},
{
label: 'Level one 2',
children: [
{
label: 'Level two 2-1',
children: [
{
label: 'Level three 2-1-1',
},
],
},
{
label: 'Level two 2-2',
children: [
{
label: 'Level three 2-2-1',
},
],
},
],
},
{
label: 'Level one 3',
children: [
{
label: 'Level two 3-1',
children: [
{
label: 'Level three 3-1-1',
},
],
},
{
label: 'Level two 3-2',
children: [
{
label: 'Level three 3-2-1',
},
],
},
],
},
]

const defaultProps = {
children: 'children',
label: 'label',
}
</script>

<template>
<!
style: 样内样式
data: 数据源
props: 默认渲染的属性名为 label 和 children
showcheckbox: 节点是否可被选择
accordion: 是否每次只打开一个同级树节点展开
@nodeclick: 节点点击事件
>
<eltree
style="max-width: 600px"
:data="data"
:props="defaultProps"
showcheckbox
accordion
@nodeclick="handleNodeClick"
/>
</template>

3. 自定义节点内容

节点的内容支持自定义,可以在节点区添加按钮或图标等内容。

在这里插入图片描述

可以通过 具名插槽 进行树节点内容的自定义:使用 具名插槽 时候会传入两个参数 node 和 data,分别表示 当前节点的 Node 对象 和 当前节点的数据。

<script setup>
import {ref} from 'vue'
const dataSource = ref([
{
id: 1,
label: 'Level one 1',
children: [
{
id: 4,
label: 'Level two 1-1',
children: [
{
id: 9,
label: 'Level three 1-1-1',
},
{
id: 10,
label: 'Level three 1-1-2',
},
],
},
],
},
{
id: 2,
label: 'Level one 2',
children: [
{
id: 5,
label: 'Level two 2-1',
},
{
id: 6,
label: 'Level two 2-2',
},
],
},
{
id: 3,
label: 'Level one 3',
children: [
{
id: 7,
label: 'Level two 3-1',
},
{
id: 8,
label: 'Level two 3-2',
},
],
},
])

let id = 1000
const onAdd = (data) => {
const newNode = { id: id++, label: 'testtest', children: [] }
if(!data.children) {
data.children = []
}
data.children.push(newNode)
// dataSource.value = […dataSource.value]
}

const onDel = (node, data) => {
const parent = node.parent
const children = parent?.data.children || parent?.data
const index = children.findIndex((d) => d.id === data.id)
children.splice(index, 1)
}
</script>

<template>
<eltree
style="max-width: 600px"
:data="dataSource"
nodekey="id"
showcheckbox
defaultexpandall
:expandonclicknode="false"
>
<template #default="{ node, data }">
<div class="custom-tree-node">
<span>{{ data.label }}</span>
<div>
<elbutton type="primary" text="plain" @click="onAdd(data)">添加</elbutton>
<elbutton type="danger" text="plain" @click="onDel(node, data)">删除</elbutton>
</div>
</div>
</template>
</eltree>
</template>

<style>
.customtreenode {
flex: 1;
width: 500px;
display: flex;
justifycontent: spacebetween;
alignitems: center;
paddingright: 8px;
}
</style>

五、Dialog弹框组件

弹框组件在保留当前页面状态的情况下,告知用户并承载相关操作,适合需要定制性更大的场景。

在这里插入图片描述

使用说明:

  • 需要设置 v-model 属性,它接收 Boolean,当为 true 时显示 Dialog。
  • Dialog 分为两个部分:body 和 footer,footer 需要具名为 footer 的 slot。title 属性用于定义标题,它是可选的,默认值为空。

<template>
<elbutton plain @click="dialogVisible = true">
Click to open the Dialog
</elbutton>

<!
vmodel: 控制对话框显示隐藏
title: 标题
width: 宽度
beforeclose: 关闭前的回调函数
>
<eldialog
vmodel="dialogVisible"
title="Tips"
width="500"
:beforeclose="handleClose"
>
<! 默认插槽:主题内容 >
<span>This is a message</span>

<! 具名插槽:底部内容 >
<template #footer>
<div class="dialog-footer">
<elbutton @click="dialogVisible = false">Cancel</elbutton>
<elbutton type="primary" @click="dialogVisible = false">
Confirm
</elbutton>
</div>
</template>
</eldialog>
</template>

<script setup>
import { ref } from 'vue'
import { ElMessageBox } from 'element-plus'

const dialogVisible = ref(false) // 对话框是否可见

const handleClose = (done) => {
ElMessageBox.confirm('Are you sure to close this dialog?')
.then(() => {
done()
})
.catch(() => {
// catch error
})
}
</script>

六、Menu菜单组件

1. 介绍

为网站提供导航功能的菜单。

2. 基础用法

顶部栏菜单可以在各种场景中使用。

导航菜单默认为垂直模式,通过将 mode 属性设置为 horizontal 来使导航菜单变更为水平模式。另外,在菜单中通过 sub-menu 组件可以生成二级菜单。

Menu还提供了 background-color、text-color 和 active-text-color,分别用于设置菜单的背景色、菜单的文字颜色和当前激活菜单的文字颜色。

3. 示例代码

<template>
<h5 class="mb-2">Custom colors</h5>
<!
菜单外层盒子:
textcolor: 文字颜色
activetextcolor: 激活菜单项的文本颜色
backgroundcolor: 菜单的背景颜色
defaultactive: 页面加载时默认激活菜单的 index
class: 自定义类名
>
<elmenu
textcolor="#fff"
activetextcolor="#ffd04b"
backgroundcolor="#545c64"
defaultactive="2"
class="el-menu-vertical-demo"
@open="handleOpen"
@close="handleClose"
>
<! 二级导航,使用elsubmenu >
<elsubmenu index="1">
<! 通过template来设置一级导航的标题 >
<template #title>
<elicon><location /></elicon>
<span>Navigator One</span>
</template>

<! 通过elmenuitemgroup进行分组 >
<elmenuitemgroup title="Group One">
<elmenuitem index="1-1">item one</elmenuitem>
<elmenuitem index="1-2">item two</elmenuitem>
</elmenuitemgroup>

<elmenuitemgroup title="Group Two">
<elmenuitem index="1-3">item three</elmenuitem>
</elmenuitemgroup>

<! 嵌套二级导航 >
<elsubmenu index="1-4">
<template #title>item four</template>
<elmenuitem index="1-4-1">item one</elmenuitem>
</elsubmenu>
</elsubmenu>

<! 一级导航使用elmenuitem >
<elmenuitem index="2">
<elicon><iconmenu /></elicon>
<span>Navigator Two</span>
</elmenuitem>

<elmenuitem index="3" disabled>
<elicon><document /></elicon>
<span>Navigator Three</span>
</elmenuitem>

<elmenuitem index="4">
<elicon><setting /></elicon>
<span>Navigator Four</span>
</elmenuitem>
</elmenu>
</template>

<script setup>
import { Document, Menu as IconMenu, Location, Setting } from '@element-plus/icons-vue'

const handleOpen = (key, keyPath) => {
console.log(key, keyPath)
}
const handleClose = (key, keyPath) => {
console.log(key, keyPath)
}
</script>

<style>
.elmenu {
width: 300px;
}
</style>

在这里插入图片描述


  • 0-9 ↩︎

  • 赞(0)
    未经允许不得转载:171主机测评 » 【Vue】Element-Plus快速入门 && Form && Card && Table && Tree && Dialog && Menu
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址