1. Element Plus 快速入门
Element:是饿了么团队研发的,基于 Vue 3,面向设计师和开发者的组件库。
组件:组成网页的部件,例如 超链接、按钮、图片、表格、表单、分页条等等。
官网:https://element-plus.org/zh-CN/#/zh-CN
准备工作
(1) 创建一个工程化的 vue 项目 npm init vue@latest
(2) 参照官方文档,安装 Element Plus 组件库(在当前工程的目录下):npm install element-plus --save
(3) 在 main.js 中引入 Element Plus 组件库(参照官方文档)
//将自动生成的main.js中的内容全部替换
import { createApp } from 'vue'//导入vue
import ElementPlus from 'element-plus'//导入element-plus
import 'element-plus/dist/index.css'//导入element-plus的样式
import App from './App.vue'//导入App.vue
const app = createApp(App)//创建应用实例
app.use(ElementPlus)//使用element-plus
app.mount('#app')//控制html元素
制作组件
(1) 访问 Element官方文档
(2) 复制组件代码
(3) 根据需要进行调整
<script lang="ts" setup>
import {
Check,
Delete,
Edit,
Message,
Search,
Star,
} from '@element-plus/icons-vue'
</script>
<template>
<el-row class="mb-4">
<el-button>Default</el-button>
<el-button type="primary">Primary</el-button>
<el-button type="success">Success</el-button>
<el-button type="info">Info</el-button>
<el-button type="warning">Warning</el-button>
<el-button type="danger">Danger</el-button>
</el-row>
<el-row class="mb-4">
<el-button plain>Plain</el-button>
<el-button type="primary" plain>Primary</el-button>
<el-button type="success" plain>Success</el-button>
<el-button type="info" plain>Info</el-button>
<el-button type="warning" plain>Warning</el-button>
<el-button type="danger" plain>Danger</el-button>
</el-row>
<el-row class="mb-4">
<el-button round>Round</el-button>
<el-button type="primary" round>Primary</el-button>
<el-button type="success" round>Success</el-button>
<el-button type="info" round>Info</el-button>
<el-button type="warning" round>Warning</el-button>
<el-button type="danger" round>Danger</el-button>
</el-row>
<el-row>
<el-button :icon="Search" circle />
<el-button type="primary" :icon="Edit" circle />
<el-button type="success" :icon="Check" circle />
<el-button type="info" :icon="Message" circle />
<el-button type="warning" :icon="Star" circle />
<el-button type="danger" :icon="Delete" circle />
</el-row>
</template>
在 API 中,还有属性等可以设置:
<script lang="ts" setup>
import {
Check,
Delete,
Edit,
Message,
Search,
Star,
} from '@element-plus/icons-vue'
</script>
<template>
<el-row class="mb-4">
<el-button>Default</el-button>
<!--设置属性-->
<el-button type="primary" disabled="true">编辑</el-button>
<el-button type="success" loading="true">查看</el-button>
</el-row>
<el-row class="mb-4">
<el-button type="info" plain>Info</el-button>
<el-button type="warning" plain>Warning</el-button>
<el-button type="danger" plain>Danger</el-button>
</el-row>
</template>
在 App.vue 中引入 Button.vue
<script setup>
import ButtonVue from "./Button.vue"
</script>
<template>
<ButtonVue/>
</template>
2. 常用组件
2.1 表格
(1) 找到表格组件
下面以基础表格为例来进行演示:
(2) 复制表格组件的代码
<script lang="ts" 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>
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="date" label="Date" width="180" />
<el-table-column prop="name" label="Name" width="180" />
<el-table-column prop="address" label="Address" />
</el-table>
</template>
(3) 修改原始的表格代码
<script lang="ts" setup>
// 准备表格所需的数据
import {// 导入表格最后一列的图标
Delete,
Edit,
} from '@element-plus/icons-vue'
const tableData = [
{
title: '标题1',
category: '时事',
time: '2000-01-01',
state: '已发布'
},
{
title: '标题1',
category: '时事',
time: '2000-01-01',
state: '已发布'
},
{
title: '标题1',
category: '时事',
time: '2000-01-01',
state: '已发布'
},
{
title: '标题1',
category: '时事',
time: '2000-01-01',
state: '已发布'
},
{
title: '标题1',
category: '时事',
time: '2000-01-01',
state: '已发布'
}
]
</script>
<template>
<!-- 表格 -->
<!-- :data属性为表格绑定数据,绑定的数据为tableData -->
<el-table :data="tableData" style="width: 100%">
<!-- prop属性给每一列绑定每一条数据里面指定属性的值 -->
<el-table-column prop="title" label="文章标题" />
<el-table-column prop="category" label="分类" />
<el-table-column prop="time" label="发表时间" />
<el-table-column prop="state" label="状态" />
<!-- 最后一列不绑定数据。给最后的列指定宽度,其余列就会平均分配剩余的宽度 -->
<el-table-column label="操作" width="180">
<!-- 最后一列的编辑和删除按钮 -->
<el-row>
<el-button type="primary" :icon="Edit" circle />
<el-button type="danger" :icon="Delete" circle />
</el-row>
</el-table-column>
</el-table>
</template>
<style scoped>
</style>
2.2 分页条
(1) 找到分页条组件
(2) 复制分页条组件的代码
(3) 修改代码
在 main.js 中导入中文环境,不然分页条上的文字是英文
<script lang="ts" setup>
// 准备分页条所需的数据
import { ref } from 'vue'
const currentPage4 = ref(2)
const pageSize4 = ref(5)
const small = ref(false)
const background = ref(false)
const disabled = ref(false)
const handleSizeChange = (val: number) => {
console.log(`${val} items per page`)
}
const handleCurrentChange = (val: number) => {
console.log(`current page: ${val}`)
}
</script>
<template>
<!-- 分页条 -->
<!-- v-model:current-page 当前展示的第几页 -->
<!-- v-model:page-size 每页默认展示的条数 -->
<!-- page-sizes下拉选择每页显示的条数 -->
<!-- small 分页条显示的大小 -->
<!-- disabled分页条是否禁用 -->
<!-- layout控制分页条的显示顺序/布局 -->
<!-- total 总条数,正常来说会绑定一个变量 -->
<!-- @size-change="handleSizeChange": 修改每页显示的条数时,回调的函数是handleSizeChange -->
<!-- @current-change="handleCurrentChange": 当点击了页签或前往第几页后,回调的函数是handleCurrentChange -->
<!-- 这两个函数的参数分别是每页显示的条数和当前页 -->
<el-pagination
class="el-p"
v-model:current-page="currentPage4"
v-model:page-size="pageSize4"
:page-sizes="[5, 10, 15, 20]"
:small="small"
:disabled="disabled"
:background="background"
layout="jumper, total, sizes, prev, pager, next"
:total="20"
@size-change="handleSizeChange"
@current-change="handleCurrentChange" />
</template>
<style scoped>
/* 分页条的样式 */
.el-p {
margin-top: 20px;
display: flex;
justify-content: flex-end;/*右对齐*/
}
</style>
2.3 表单
(1) 找到表单组件
(2) 复制表单组件的代码
<script lang="ts" setup>
// 表单所需的数据
import { reactive } from 'vue'
const formInline = reactive({
user: '',
region: '',
date: '',
})
const onSubmit = () => {
console.log('submit!')
}
</script>
<template>
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<el-form-item label="Approved by">
<el-input v-model="formInline.user" placeholder="Approved by" clearable />
</el-form-item>
<el-form-item label="Activity zone">
<el-select v-model="formInline.region" placeholder="Activity zone" clearable>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
<el-form-item label="Activity time">
<el-date-picker v-model="formInline.date" type="date" placeholder="Pick a date" clearable />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">Query</el-button>
</el-form-item>
</el-form>
</template>
<style>
.demo-form-inline .el-input {
--el-input-width: 220px;
}
.demo-form-inline .el-select {
--el-select-width: 220px;
}
</style>
(3) 修改原始的表单代码
<script lang="ts" setup>
// 准备表单所需的数据
import { reactive } from 'vue'
const formInline = reactive({
user: '',
region: '',
date: '',
})
const onSubmit = () => {
console.log('submit!')
}
</script>
<template>
<!-- 表单 -->
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<!-- 在下拉选择时,两个下拉表单最终展示的内容是相同的
这是因为两个下拉列表绑定的都是formInline.region数据
实际开发中只要将二者绑定上不同的数据就不会出现该问题了 -->
<el-form-item label="文章分类">
<el-select v-model="formInline.region" placeholder="请选择" clearable >
<el-option label="时事" value="时事" />
<el-option label="篮球" value="篮球" />
</el-select>
</el-form-item>
<el-form-item label="发布状态">
<el-select v-model="formInline.region" placeholder="请选择" clearable >
<el-option label="已发布" value="已发布" />
<el-option label="草稿" value="草稿" />
</el-select>
</el-form-item>
<el-form-item>
<!-- type控制按钮的样式 -->
<el-button type="primary" @click="onSubmit">搜索</el-button>
</el-form-item>
<el-form-item>
<el-button type="default" @click="onSubmit">重置</el-button>
</el-form-item>
</el-form>
</template>
<style scoped>
/* 下拉列表的样式 */
.demo-form-inline .el-input {
--el-input-width: 220px;
}
.demo-form-inline .el-select {
--el-select-width: 220px;
}
</style>
2.4 卡片
(1) 找到卡片组件
(2) 复制卡片组件的代码
<script lang="ts" setup>
</script>
<template>
<el-card class="box-card">
<template #header>
<div class="card-header">
<span>Card name</span>
<el-button class="button" text>Operation button</el-button>
</div>
</template>
<div v-for="o in 4" :key="o" class="text item">{{ 'List item ' + o }}</div>
<template #footer>Footer content</template>
</el-card>
</template>
<style scoped>
</style>
(3) 修改代码
<script lang="ts" setup>
</script>
<template>
<el-card class="box-card">
<div class="card-header">
<span>文章管理</span>
<el-button type="primary" >发布文章</el-button>
</div>
<!-- 分隔线 -->
<div style="margin-top: 20px;">
<hr/>
</div>
<!-- 其他内容也写到卡片里面 -->
</el-card>
</template>
<style scoped>
.card-header{
display: flex;
justify-content: space-between;
}
</style>
3. 案例整合
最终效果:
main.js
import { createApp } from 'vue'//导入vue
import ElementPlus from 'element-plus'//导入element-plus
import 'element-plus/dist/index.css'//导入element-plus的样式
import App from './App.vue'//导入App.vue
// 导入中文语言环境
import locale from 'element-plus/dist/locale/zh-cn.js'
const app = createApp(App)//创建应用实例
app.use(ElementPlus, {locale})//使用element-plus
app.mount('#app')//控制html元素
App.vue
<script setup>
import ArticleVue from "./Article.vue"
</script>
<template>
<ArticleVue/>
</template>
Article.vue
<script lang="ts" setup>
// 准备表单所需的数据
import { reactive } from 'vue'
const formInline = reactive({
user: '',
region: '',
date: '',
})
const onSubmit = () => {
console.log('submit!')
}
// 准备分页条所需的数据
import { ref } from 'vue'
const currentPage4 = ref(2)
const pageSize4 = ref(5)
const small = ref(false)
const background = ref(false)
const disabled = ref(false)
const handleSizeChange = (val: number) => {
console.log(`${val} items per page`)
}
const handleCurrentChange = (val: number) => {
console.log(`current page: ${val}`)
}
// 准备表格所需的数据
import {// 导入表格最后一列的图标
Delete,
Edit,
} from '@element-plus/icons-vue'
const tableData = [
{
title: '标题1',
category: '时事',
time: '2000-01-01',
state: '已发布'
},
{
title: '标题1',
category: '时事',
time: '2000-01-01',
state: '已发布'
},
{
title: '标题1',
category: '时事',
time: '2000-01-01',
state: '已发布'
},
{
title: '标题1',
category: '时事',
time: '2000-01-01',
state: '已发布'
},
{
title: '标题1',
category: '时事',
time: '2000-01-01',
state: '已发布'
}
]
</script>
<template>
<!-- 卡片 -->
<el-card class="box-card">
<div class="card-header">
<span>文章管理</span>
<el-button type="primary" >发布文章</el-button>
</div>
<!-- 分隔线 -->
<div style="margin-top: 20px;">
<hr/>
</div>
<!-- 其他内容也写到卡片里面 -->
<!-- 表单 -->
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<!-- 在下拉选择时,两个下拉表单最终展示的内容是相同的
这是因为两个下拉列表绑定的都是formInline.region数据
实际开发中只要将二者绑定上不同的数据就不会出现该问题了 -->
<el-form-item label="文章分类">
<el-select v-model="formInline.region" placeholder="请选择" clearable >
<el-option label="时事" value="时事" />
<el-option label="篮球" value="篮球" />
</el-select>
</el-form-item>
<el-form-item label="发布状态">
<el-select v-model="formInline.region" placeholder="请选择" clearable >
<el-option label="已发布" value="已发布" />
<el-option label="草稿" value="草稿" />
</el-select>
</el-form-item>
<el-form-item>
<!-- type控制按钮的样式 -->
<el-button type="primary" @click="onSubmit">搜索</el-button>
</el-form-item>
<el-form-item>
<el-button type="default" @click="onSubmit">重置</el-button>
</el-form-item>
</el-form>
<!-- 表格 -->
<!-- :data属性为表格绑定数据,绑定的数据为tableData -->
<el-table :data="tableData" style="width: 100%">
<!-- prop属性给每一列绑定每一条数据里面指定属性的值 -->
<el-table-column prop="title" label="文章标题" />
<el-table-column prop="category" label="分类" />
<el-table-column prop="time" label="发表时间" />
<el-table-column prop="state" label="状态" />
<!-- 最后一列不绑定数据。给最后的列指定宽度,其余列就会平均分配剩余的宽度 -->
<el-table-column label="操作" width="180">
<!-- 最后一列的编辑和删除按钮 -->
<el-row>
<el-button type="primary" :icon="Edit" circle />
<el-button type="danger" :icon="Delete" circle />
</el-row>
</el-table-column>
</el-table>
<!-- 分页条 -->
<!-- v-model:current-page 当前展示的第几页 -->
<!-- v-model:page-size 每页默认展示的条数 -->
<!-- page-sizes下拉选择每页显示的条数 -->
<!-- small 分页条显示的大小 -->
<!-- disabled分页条是否禁用 -->
<!-- layout控制分页条的显示顺序/布局 -->
<!-- total 总条数,正常来说会绑定一个变量 -->
<!-- @size-change="handleSizeChange": 修改每页显示的条数时,回调的函数是handleSizeChange -->
<!-- @current-change="handleCurrentChange": 当点击了页签或前往第几页后,回调的函数是handleCurrentChange -->
<!-- 这两个函数的参数分别是每页显示的条数和当前页 -->
<el-pagination
class="el-p"
v-model:current-page="currentPage4"
v-model:page-size="pageSize4"
:page-sizes="[5, 10, 15, 20]"
:small="small"
:disabled="disabled"
:background="background"
layout="jumper, total, sizes, prev, pager, next"
:total="20"
@size-change="handleSizeChange"
@current-change="handleCurrentChange" />
</el-card>
</template>
<style scoped>
/* 卡片的样式 */
.card-header{
display: flex;/*弹性盒布局*/
justify-content: space-between;/*两端对齐,项目之间的间隔相等*/
}
/* 下拉列表的样式 */
.demo-form-inline .el-input {
--el-input-width: 220px;
}
.demo-form-inline .el-select {
--el-select-width: 220px;
}
/* 分页条的样式 */
.el-p {
margin-top: 20px;
display: flex;
justify-content: flex-end;/*右对齐*/
}
</style>