Element Plus 基本使用

蔚落 2024-04-17 13:48 130阅读 0赞

一、概述

1.1介绍

Element Plus 基本使用

element-ui 是基于vue 开发的一套ui组件库,提供丰富的网页开发组件,可用快速开发网站,降低前端开发成本
版本 element目前有两个版本

  • element-ui:基于vue2
  • element-plus: 基于vue3

官网地址

  1. https://element-plus.org/zh-CN/

element-plus 基本使用

  1. 1.安装
  2. npm install element-plus
  3. 2. vue项目main.js引入element-plus组件,以及css文件
  4. 3. 在官方文档中找到需要的样式组件复制代码对应的.vue中使用。

具体部署请看快速开始

1.2网页基础布局

icon组件

安装

  1. pnpm install @element-plus/icons-vue

在main.ts中进行全局挂载

e968bf8c891e4b8fa0977cfd498b7e1d.png

官网图标地址

  1. https://element-plus.org/zh-CN/component/icon.html#

Container 布局容器

  1. <div class="common-layout">
  2. <el-container>
  3. <el-aside width="200px">Aside</el-aside>
  4. <el-main>Main</el-main>
  5. </el-container>
  6. </div>

我们将这个布局抽离为两个组件,分别为一个header组件和一个aside组件,接下来开始抽离。

模板组件分离

header组件
  1. <!-- eslint-disable @typescript-eslint/no-unused-vars -->
  2. <!-- eslint-disable @typescript-eslint/no-unused-vars -->
  3. <template>
  4. <div>
  5. <el-header style="display: flex; font-size: 16px;">
  6. <!-- 左侧部分,包含侧边栏展开/折叠图标 -->
  7. <div style="display: inline-flex; flex: 1; align-items: center; justify-content: left;">
  8. <!-- 展开图标(非折叠状态时显示) -->
  9. <el-icon v-show="!showIcon.isCollapse" @click="collapseAside" style="color: #303133;">
  10. <Fold />
  11. </el-icon>
  12. <!-- 折叠图标(折叠状态时显示) -->
  13. <el-icon v-show="showIcon.isCollapse" @click="collapseAside" style="color: #303133;">
  14. <Expand />
  15. </el-icon>
  16. </div>
  17. <!-- 右侧工具栏区域 -->
  18. <div class="toolbar">
  19. <!-- 用户头像 -->
  20. <div class="block" style="margin-right: 10px;">
  21. <el-avatar :size="40" :src="Avatar" />
  22. </div>
  23. <!-- 用户名文本 -->
  24. <span>管理员</span>
  25. <!-- 下拉菜单,包含更多操作选项 -->
  26. <el-dropdown trigger="click">
  27. <!-- 设置图标 -->
  28. <el-icon style="margin-left: 18px; margin-top: 1px; color: #303133;">
  29. <setting />
  30. </el-icon>
  31. <!-- 下拉菜单内容模板 -->
  32. <template #dropdown>
  33. <el-dropdown-menu>
  34. <el-dropdown-item>View</el-dropdown-item>
  35. <el-dropdown-item>Add</el-dropdown-item>
  36. <el-dropdown-item @click="LogOut">退出登录</el-dropdown-item>
  37. </el-dropdown-menu>
  38. </template>
  39. </el-dropdown>
  40. </div>
  41. </el-header>
  42. </div>
  43. </template>
  44. <script setup lang="ts">
  45. import Avatar from '@/assets/touxiang.jpg'
  46. import { ref } from 'vue'
  47. // eslint-disable-next-line vue/no-dupe-keys, @typescript-eslint/no-unused-vars
  48. const isCollapse = ref(true)
  49. // 获取父组件传递过来的数据
  50. const showIcon = defineProps({
  51. isCollapse: Boolean
  52. })
  53. // 获取父组件自定义的事件
  54. const emit = defineEmits(['changeAside'])
  55. // 自定义按钮点击事件,侧边栏的收缩按钮
  56. const collapseAside = () => {
  57. emit('changeAside')
  58. }
  59. // 登出按钮
  60. const LogOut = ()=>{
  61. }
  62. </script>
  63. <style>
  64. .el-header {
  65. width: 100%;
  66. background-color: #fff;
  67. color: var(--el-text-color-primary);
  68. box-shadow: var(--el-box-shadow);
  69. }
  70. .toolbar {
  71. display: inline-flex;
  72. align-items: center;
  73. justify-content: center;
  74. height: 100%;
  75. right: 20px;
  76. text-align: right;
  77. }
  78. .el-dropdown-menu__item {
  79. width: 120px;
  80. }
  81. .icon-color {
  82. color: white;
  83. }
  84. </style>
aside组件
  1. <script setup>
  2. import { Monitor } from '@element-plus/icons-vue';
  3. import { ref } from 'vue'
  4. const settings = defineProps({
  5. collapse: Boolean,
  6. width: String
  7. })
  8. const iconColor = ref('color:#F8FAFB')
  9. </script>
  10. <template>
  11. <el-aside :width="settings.width">
  12. <el-scrollbar>
  13. <el-menu :default-openeds="['1', '3']"
  14. :collapse="settings.collapse" active-text-color="#ffd04b"
  15. background-color="#304156" text-color="#FFFFFF" router="true">
  16. <el-menu-item index="1">
  17. <el-icon><Monitor /></el-icon>
  18. <template #title>仪表板</template>
  19. </el-menu-item>
  20. <el-sub-menu index="2">
  21. <template #title>
  22. <el-icon>
  23. <Menu />
  24. </el-icon><span>文章管理</span>
  25. </template>
  26. <el-menu-item index="/admin/articles">文章管理列表</el-menu-item>
  27. </el-sub-menu>
  28. <el-sub-menu index="3">
  29. <template #title>
  30. <el-icon>
  31. <Message />
  32. </el-icon><span>评论管理</span>
  33. </template>
  34. <el-menu-item index="/admin/comments">评论管理列表</el-menu-item>
  35. </el-sub-menu>
  36. <el-sub-menu index="4">
  37. <template #title>
  38. <el-icon>
  39. <Files />
  40. </el-icon><span>模块管理</span>
  41. </template>
  42. <el-menu-item index="/admin/blocks">模块管理列表</el-menu-item>
  43. </el-sub-menu>
  44. </el-menu>
  45. </el-scrollbar>
  46. </el-aside>
  47. </template>
  48. <style scoped>
  49. .el-aside {
  50. height: 100vh;
  51. overflow: hidden;
  52. box-shadow: var(--el-box-shadow-lighter);
  53. }
  54. .el-scrollbar {
  55. height: 100vh;
  56. overflow: hidden;
  57. background-color: #304156;
  58. }
  59. .el-menu {
  60. border-right: none;
  61. }</style>
动态路由
  1. import { createRouter, createWebHistory } from 'vue-router'
  2. import HomeView from '@/views/HomeView.vue'
  3. const router = createRouter({
  4. history: createWebHistory(import.meta.env.BASE_URL),
  5. routes: [
  6. {
  7. path: '/',
  8. name: '仪表盘',
  9. component: HomeView
  10. },
  11. {
  12. path: '/article',
  13. name: '文章管理',
  14. component: HomeView,
  15. children: [
  16. {
  17. path: '/id',
  18. name: '文章管理列表',
  19. component: () => (
  20. '../views/A.vue'
  21. )
  22. }
  23. ]
  24. },
  25. {
  26. path: '/comment',
  27. name: '评论管理',
  28. component: HomeView,
  29. children: [
  30. {
  31. path: '/id',
  32. name: '评论管理列表',
  33. component: () => (
  34. '../views/B.vue'
  35. )
  36. }
  37. ],
  38. },
  39. ]
  40. })
  41. export default router

侧边栏代码改进

  1. <template>
  2. <el-aside :width="settings.width">
  3. <el-scrollbar>
  4. <el-menu :default-openeds="['1', '3']"
  5. :collapse="settings.collapse" active-text-color="#ffd04b"
  6. background-color="#304156" text-color="#FFFFFF" router="true">
  7. <template v-for="menu in this.$router.options.routes" :key="menu">
  8. <!-- 当前菜单项没有子菜单时 -->
  9. <el-menu-item v-if="!menu.children" :index="menu.path">
  10. <el-icon><component :is="menu.icon" ></component> </el-icon>
  11. <span>{
  12. {menu.name}}</span>
  13. </el-menu-item>
  14. <!-- 当前菜单项有子菜单时 -->
  15. <el-sub-menu v-else-if="menu.children" :index="menu.path">
  16. <template #title>
  17. <el-icon><component :is="menu.icon" ></component> </el-icon>
  18. <span>{
  19. {menu.name}}</span>
  20. </template>
  21. <!-- 循环遍历子菜单项 -->
  22. <el-menu-item v-for="child in menu.children" :key="child" :index="child.path">{
  23. {child.name}}</el-menu-item>
  24. </el-sub-menu>
  25. </template>
  1. Element Plus Icon组件:如果你正在使用 Element Plus UI 库,你可以直接使用其提供的 Icon 组件来显示图标。你可以在路由配置中使用该组件作为路由菜单的一部分,例如在meta字段中定义图标名称,然后在导航菜单的组件中动态渲染它。
  2. SVG图标:你可以使用 SVG 格式的图标,并在你的 Vue 组件中直接引入它们。这种方法允许你在路由配置中指定不同的 SVG 文件,并在导航菜单中显示它们。
  3. @iconify/vue:这是一个流行的图标库,提供了多种图标集的支持。你可以通过这个库来在你的 Vue 项目中使用图标,包括在路由中。你可以选择适合你项目的图标集,并在路由配置中指定相应的图标类名。

整合

  1. <script setup>
  2. import { ref } from 'vue'
  3. // 组件注册
  4. import Header from '@/components/Header.vue'
  5. import Aside from '@/components/Aside.vue'
  6. const asideSettings = ref({
  7. isCollapse:true,
  8. width:'200'
  9. })
  10. // 给子组件绑定事件,通过子组件emit从而改变父组件的值
  11. const changeAside = ()=>{
  12. asideSettings.value.isCollapse = !asideSettings.value.isCollapse
  13. if(asideSettings.value.isCollapse){
  14. asideSettings.value.width = "64"
  15. }else{
  16. asideSettings.value.width = "200"
  17. }
  18. }
  19. </script>
  20. <template>
  21. <el-container style="min-height: 100vh;min-width: 100vw;overflow: hidden;">
  22. <Aside :collapse="asideSettings.isCollapse" :width="asideSettings.width"></Aside>
  23. <el-container style="height: 100vh;width:100%;display: flex;flex-direction: column;">
  24. <Header :isCollapse="asideSettings.isCollapse" @changeAside="changeAside"></Header>
  25. <el-main>
  26. <div v-if="$route.path === '/'">
  27. <el-card>
  28. <h1>文本内容</h1>
  29. </el-card>
  30. </div>
  31. <router-view v-else></router-view>
  32. </el-main>
  33. </el-container>
  34. </el-container>
  35. </template>
  36. <style scoped>
  37. body{
  38. background-color: #eee;
  39. max-width: 100vw;
  40. overflow: hidden;
  41. }
  42. .el-main {
  43. width: 100%;
  44. padding: 0;
  45. height: 100vh;
  46. overflow-x: hidden;
  47. }
  48. </style>

1.3基础布局知识

dc03b961666a40c6b37416dd1409ff87.png

盒子模型拆分网页

985c5bffc0b7484f8e9c2f96253746b2.png

在你的 UserController 的上面加个小注解

  1. @CrossOrigin

`@CrossOrigin` 注解是 Java 中 Spring 框架提供的一种用于处理跨域请求的方法。跨域请求通常出现在前后端分离的 Web 应用中,当前端和后端部署在不同的域名或端口下时,浏览器会因为同源策略(Same-origin policy)而阻止跨域请求。

使用 `@CrossOrigin` 注解可以允许来自不同域的请求访问后端资源。该注解可以应用于类级别和方法级别,用于配置 CORS(CORS:跨域资源共享)相关的参数。

下面是一个示例代码,演示如何在 Spring 中使用 `@CrossOrigin` 注解:

  1. import org.springframework.web.bind.annotation.CrossOrigin;
  2. import org.springframework.web.bind.annotation.GetMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. @RestController
  5. @CrossOrigin(origins = "http://example.com", maxAge = 3600)
  6. public class MyController {
  7. @GetMapping("/api/data")
  8. @CrossOrigin(methods = ["GET"], allowedHeaders = ["Content-Type"])
  9. public String getData() {
  10. // 处理跨域请求的逻辑
  11. return "Hello, World!";
  12. }
  13. }

在上述代码中,`@CrossOrigin` 注解应用于类级别和方法级别。类级别的注解允许来自 `http://example.com\` 域的请求访问所有方法。方法级别的注解进一步限制了只允许 `GET` 方法的跨域请求,并指定了允许的请求头为 `Content-Type`。

通过配置 `@CrossOrigin` 注解,可以实现对跨域请求的灵活控制,确保安全性和数据的正确交互。

二、Element Plus 基本样式

2.1按钮

  1. <template>
  2. <h3>按钮</h3>
  3. <el-button>默认按钮</el-button>
  4. <el-button type="primary">主要按钮</el-button>
  5. <el-button type="success">成功按钮</el-button>
  6. <el-button type="info">信息按钮</el-button>
  7. <el-button type="warning">警告按钮</el-button>
  8. <el-button type="danger">危险按钮</el-button>
  9. <hr>
  10. <h3>按钮属性</h3>
  11. <el-button plain>朴素按钮</el-button>
  12. <el-button round>圆角按钮</el-button>
  13. <el-button circle></el-button>
  14. <el-button disabled>禁用按钮</el-button>
  15. <el-button loading>加载中</el-button>
  16. <hr>
  17. <h3>尺寸</h3>
  18. <el-button size="large">大型按钮</el-button>
  19. <el-button>默认按钮</el-button>
  20. <el-button size="small">小型按钮</el-button>
  21. </template>

25367bdc550c49f6a46998fd40bdb809.png

2.2图标

  1. <template>
  2. <h3>图标</h3>
  3. <el-icon><Plus /></el-icon>
  4. <el-icon><Edit /></el-icon>
  5. <el-icon><Delete /></el-icon>
  6. <el-icon class="is-loading"><Loading /></el-icon>
  7. <hr>
  8. <h3>属性</h3>
  9. <el-icon size="30" color="red"><Search /></el-icon>
  10. <hr>
  11. <h3>按钮</h3>
  12. <el-button type="primary">
  13. <el-icon><Search /></el-icon>
  14. <span> 搜索 </span>
  15. </el-button>
  16. <el-button type="primary">
  17. <el-icon><Search /></el-icon>
  18. </el-button>
  19. <el-button type="primary" circle>
  20. <el-icon><Search /></el-icon>
  21. </el-button>
  22. <hr>
  23. <h3>按钮组</h3>
  24. <el-button-group>
  25. <el-button type="primary">
  26. <el-icon><Plus /></el-icon>
  27. </el-button>
  28. <el-button type="primary">
  29. <el-icon><Edit /></el-icon>
  30. </el-button>
  31. <el-button type="primary">
  32. <el-icon><Delete /></el-icon>
  33. </el-button>
  34. </el-button-group>
  35. </template>

588dd12555a0472184397a3ee9677bed.png

2.3提示框

  1. <script setup lang="ts">
  2. import { ElMessage, ElMessageBox, ElNotification } from 'element-plus'
  3. // 消息
  4. const openMsg = () => {
  5. ElMessage({
  6. type: 'success', // success | warning | info | error
  7. message: 'hello world',
  8. showClose: true
  9. })
  10. }
  11. // 确认框
  12. const openConfirm = () => {
  13. ElMessageBox.confirm('确认删除?', '标题', {
  14. type: 'warning',
  15. confirmButtonText: '确认',
  16. cancelButtonText: '取消'
  17. }).then(() => {
  18. console.log('确认')
  19. }).catch(() => {
  20. console.log('取消')
  21. })
  22. }
  23. // 通知
  24. const openNotifiy = () => {
  25. ElNotification({
  26. title: '标题',
  27. message: '烟雨平生',
  28. duration: 1500 // 展示时间 [单位:毫秒]
  29. })
  30. }
  31. // 通知2
  32. const openNotifiy2 = () => {
  33. ElNotification({
  34. type: 'success', // success | warning | info | error
  35. title: '标题',
  36. message: 'hello world',
  37. duration: 1500,
  38. position: 'bottom-right'
  39. })
  40. }
  41. </script>
  42. <template>
  43. <div>
  44. <el-button @click="openMsg">消息</el-button>
  45. <el-button @click="openConfirm">确认框</el-button>
  46. <el-button @click="openNotifiy">通知</el-button>
  47. <el-button @click="openNotifiy2">通知2</el-button>
  48. </div>
  49. </template>

" class="reference-link">5d907b0f18974adead09c549718e1e27.png

2.4导航

详情请见导航

61f60e207a714644808162643de51a97.png

2.5标签页

标签页详情请见标签页

  1. <script setup lang="ts">
  2. import { ref, reactive } from 'vue'
  3. //默认选中的标签名称
  4. const selectedName = ref("2")
  5. //选中标签触发的回调
  6. const tabClick = (tab, event) => {
  7. console.log("tab", tab.props, "event", event)
  8. }
  9. const tab = reactive({
  10. arr: [
  11. { name: "1", title: '烟雨', content: '内容1' },
  12. { name: "2", title: '烟雨平生', content: '内容2' },
  13. { name: "3", title: 'com', content: '内容3' },
  14. ]
  15. })
  16. //添加
  17. const tabAdd = () => {
  18. let index = tab.arr.length
  19. index++
  20. tab.arr.push({
  21. name: index,
  22. title: '新选项卡' + index,
  23. content: '内容' + index
  24. })
  25. }
  26. //移除
  27. const tabRemove = (name) => {
  28. console.log("name:", name)
  29. const index = tab.arr.findIndex((value) => {
  30. return value.name === name
  31. })
  32. tab.arr.splice(index, 1) //移除元素
  33. }
  34. </script>
  35. <template>
  36. <div>
  37. <h3>标签页</h3>
  38. <el-tabs v-model="selectedName" @tab-click="tabClick">
  39. <el-tab-pane label="烟雨" name="1">内容1</el-tab-pane>
  40. <el-tab-pane label="烟雨平生" name="2">内容2</el-tab-pane>
  41. <el-tab-pane label="com" name="3">内容3</el-tab-pane>
  42. </el-tabs>
  43. <h3>卡片风格</h3>
  44. <el-tabs v-model="selectedName" @tab-click="tabClick" type="card">
  45. <el-tab-pane label="烟雨" name="a">内容1</el-tab-pane>
  46. <el-tab-pane label="烟雨平生" name="b">内容2</el-tab-pane>
  47. <el-tab-pane label="com" name="c">内容3</el-tab-pane>
  48. </el-tabs>
  49. <h3>带有边框的卡片风格</h3>
  50. <el-tabs v-model="selectedName" @tab-click="tabClick" type="border-card">
  51. <el-tab-pane label="烟雨" name="A">内容1</el-tab-pane>
  52. <el-tab-pane label="烟雨平生" name="B">内容2</el-tab-pane>
  53. <el-tab-pane label="com" name="C">内容3</el-tab-pane>
  54. </el-tabs>
  55. <h3>动态添加</h3>
  56. <el-button @click="tabAdd">添加</el-button>
  57. <el-tabs v-model="selectedName" @tab-remove="tabRemove" closable type="card">
  58. <el-tab-pane v-for="(value, key) in tab.arr" :key="value.name" :label="value.title" :name="value.name">
  59. {
  60. { value.content }}
  61. </el-tab-pane>
  62. </el-tabs>
  63. </div>
  64. </template>

2517b69c776b4ef8a6c3c56dc598bef2.png

2.6输入框

详情请见输入框

0139e8128ece4e59a1d6a445e9edf293.png

  1. <script setup lang="ts">
  2. import { ref } from 'vue'
  3. const name = ref('')
  4. const password = ref('')
  5. const content = ref('烟雨平生')
  6. const url = ref('com')
  7. const url2 = ref('code')
  8. const email = ref('123456')
  9. //const selected = ref('')
  10. const selected = ref('2') //选中的下拉框
  11. </script>
  12. <template>
  13. <div style="width: 300px;">
  14. <!-- clearable 可一键清空 -->
  15. <h3>输入框</h3>
  16. <el-input v-model="name" clearable placeholder="请输入用户名" />
  17. <!-- show-password 可切换显示隐藏密码 -->
  18. <h3>密码框</h3>
  19. <el-input v-model="password" show-password placeholder="请输入密码" />
  20. <h3>文本域</h3>
  21. <el-input type="textarea" v-model="content" rows="2" />
  22. <h3>输入内容长度限制 - 输入框</h3>
  23. <el-input v-model="name" maxlength="10" show-word-limit />
  24. <h3>输入内容长度限制 - 文本域</h3>
  25. <el-input type="textarea" v-model="content" maxlength="20" rows="3" show-word-limit />
  26. <h3>尺寸</h3>
  27. <el-input size="large" />
  28. 默认 <el-input />
  29. <el-input size="small" />
  30. <h3>前置</h3>
  31. <el-input v-model="url">
  32. <template #prepend>https://</template>
  33. </el-input>
  34. <h3>后置</h3>
  35. <el-input v-model="email">
  36. <template #append>@qq.com</template>
  37. </el-input>
  38. <h3>前置后置</h3>
  39. <el-input v-model="url2">
  40. <template #prepend>https://</template>
  41. <template #append>.com</template>
  42. </el-input>
  43. <h3>前置后置扩展 - 搜索</h3>
  44. <el-input placeholder="请输入课程名称">
  45. <template #prepend>
  46. <el-select v-model="selected" placeholder="请选择" style="width: 100px;">
  47. <el-option label="前端" value="1" />
  48. <el-option label="后端" value="2" />
  49. <el-option label="服务端" value="3" />
  50. </el-select>
  51. </template>
  52. <template #append>
  53. <el-button>
  54. <el-icon><Search /></el-icon>
  55. </el-button>
  56. </template>
  57. </el-input>
  58. </div>
  59. </template>

2.7单选框、复选框

详情请见单选框

多选框

2d21ddae432f43aa8553f38339d04f3a.png

2.8下拉框

详情请见下拉选择器

5c9c387118f7406495b2d58b04a6a259.png

  1. <script setup lang="ts">
  2. import { ref,reactive } from 'vue'
  3. const selected = ref('2')
  4. const selected2 = ref('')
  5. const selected3 = ref('C')
  6. const selected4 = ref(['1','3'])
  7. const data = reactive({
  8. options: [
  9. { value: 'A', label: '前端', },
  10. { value: 'B', label: '后端', },
  11. { value: 'C', label: '服务端', }
  12. ]
  13. })
  14. //回调
  15. const selectChange = (val) => {
  16. console.log("selectChange:", val)
  17. }
  18. </script>
  19. <template>
  20. <div style="width: 300px;">
  21. <h3>下拉框</h3>
  22. <el-select v-model="selected" placeholder="请选择">
  23. <el-option value="1" label="前端" />
  24. <el-option value="2" label="后端" />
  25. <el-option value="3" label="服务端" />
  26. </el-select>
  27. <h3>下拉框 - 事件绑定</h3>
  28. <el-select v-model="selected2" @change="selectChange" placeholder="请选择">
  29. <el-option value="a" label="前端" />
  30. <el-option value="b" label="后端" />
  31. <el-option value="c" label="服务端" />
  32. </el-select>
  33. <h3>动态下拉框</h3>
  34. <el-select v-model="selected3" placeholder="请选择">
  35. <el-option v-for="item in data.options"
  36. :value="item.value"
  37. :label="item.label"
  38. :key="item.value" />
  39. </el-select>
  40. <h3>多选 - multiple</h3>
  41. <el-select v-model="selected4" multiple @change="selectChange" placeholder="请选择">
  42. <el-option value="1" label="前端" />
  43. <el-option value="2" label="后端" />
  44. <el-option value="3" label="服务端" />
  45. </el-select>
  46. </div>
  47. </template>

2.9日期选择器

详情请见日期选择器

b6f87b373da74b65b061fb0968aa66f9.png

2.10表单

" class="reference-link">73f59890c2b94327acc32dca14f2d15a.png

2.11对话框

详情请见对话框

7c95d5d9241043e7b66ef4487a641585.png

  1. <script setup>
  2. import { ref } from 'vue'
  3. const data = ref({
  4. name: '',
  5. radio: '',
  6. checkbox: [],
  7. date: '',
  8. select: '',
  9. multipleSelect: [],
  10. textarea: ''
  11. })
  12. const add = () => {
  13. console.log(data.value)
  14. }
  15. const reset = () => {
  16. data.value = {
  17. name: '',
  18. radio: '',
  19. checkbox: [],
  20. date: '',
  21. select: '',
  22. multipleSelect: [],
  23. textarea: ''
  24. }
  25. }
  26. //对话框
  27. const dialog = ref(false)
  28. const dialogClose = () => {
  29. console.log("关闭")
  30. }
  31. </script>
  32. <template>
  33. <el-button @click="dialog = true">打开</el-button>
  34. <!-- draggable 允许拖拽 -->
  35. <el-dialog v-model="dialog" width="500" title="标题" draggable @close="dialogClose">
  36. <el-form label-width="80">
  37. <el-form-item label="文本框">
  38. <el-input v-model="data.name" placeholder="请填写名称" />
  39. </el-form-item>
  40. <el-form-item label="单选框">
  41. <el-radio-group v-model="data.radio">
  42. <el-radio value="1">前端</el-radio>
  43. <el-radio value="2">后端</el-radio>
  44. <el-radio value="3">服务端</el-radio>
  45. </el-radio-group>
  46. </el-form-item>
  47. <el-form-item label="复选框">
  48. <el-checkbox-group v-model="data.checkbox">
  49. <el-checkbox value="a">前端</el-checkbox>
  50. <el-checkbox value="b">后端</el-checkbox>
  51. <el-checkbox value="c">服务端</el-checkbox>
  52. </el-checkbox-group>
  53. </el-form-item>
  54. <el-form-item label="日期时间">
  55. <el-date-picker v-model="data.date" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" />
  56. </el-form-item>
  57. <el-form-item label="下拉框">
  58. <el-select v-model="data.select" placeholder="请选择">
  59. <el-option value="A" label="前端" />
  60. <el-option value="B" label="后端" />
  61. <el-option value="C" label="服务端" />
  62. </el-select>
  63. </el-form-item>
  64. <el-form-item label="多选框">
  65. <el-select v-model="data.multipleSelect" multiple placeholder="请选择">
  66. <el-option value="AA" label="前端" />
  67. <el-option value="BB" label="后端" />
  68. <el-option value="CC" label="服务端" />
  69. </el-select>
  70. </el-form-item>
  71. <el-form-item label="文本域">
  72. <el-input type="textarea" v-model="data.textarea" rows="2" placeholder="请填写内容" />
  73. </el-form-item>
  74. <el-form-item>
  75. <el-button type="primary" @click="add">添加</el-button>
  76. <el-button @click="reset">重置</el-button>
  77. </el-form-item>
  78. </el-form>
  79. </el-dialog>
  80. </template>

2.12表格

详情请见表格

74a42b62ddf441ecb648e857fe75720d.png

三、实战进阶

3.1设置布局

栅格布局:通过基础的24分栏,迅速便捷创建布局,

  1. el-row 代表行,里面嵌套el-col
  2. el-col 代表列,总分为24
  3. 属性
  4. gutter列间隔
  5. span占据的列数

a4a13fde50bb409f81f314a09a84b2b5.png

  1. <script setup>
  2. import { ref } from 'vue'
  3. </script>
  4. <template>
  5. <div>
  6. <h3>这是A页面的栅格</h3>
  7. <el-row :gutter="10">
  8. <el-col :span="12">
  9. <div style="background: green">第一列</div>
  10. </el-col>
  11. <el-col :span="12">
  12. <div style="background: orange">第二列</div>
  13. </el-col>
  14. </el-row>
  15. <br>
  16. <el-row :gutter="10">
  17. <el-col :span="8">
  18. <div style="background: green">第一列</div>
  19. </el-col>
  20. <el-col :span="8">
  21. <div style="background: orange">第二列</div>
  22. </el-col>
  23. <el-col :span="8">
  24. <div style="background: blueviolet">第三列</div>
  25. </el-col>
  26. </el-row>
  27. <br>
  28. <el-row :gutter="10">
  29. <el-col :span="4">
  30. <div style="background: green">第一列</div>
  31. </el-col>
  32. <el-col :span="5">
  33. <div style="background: orange">第二列</div>
  34. </el-col>
  35. <el-col :span="8">
  36. <div style="background: blueviolet">第三列</div>
  37. </el-col>
  38. </el-row>
  39. </div>
  40. </template>
  41. <style scoped></style>

3.2表单:校验规则

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

  1. el-input: 输入框
  2. el-select: 下拉框
  3. el-checkbox-group 多选框
  4. el-radio-group:单选框

表单:校验规则

表单组件允许你校验用户的宿儒是否符合规范,来帮助你找到和纠正错误
使用流程

  1. 1.定义校验规则
  2. 2el-form指定“rules 属性传入定义的校验规则
  3. 3.el-form-item指定“prop”属性与校验规则名称对应

" class="reference-link">8a5bd6725e9f44c0875a7d75ca05bf6a.png

  1. <script setup lang="ts">
  2. import { reactive ,ref} from 'vue';
  3. import { ElForm, FormInstance , FormRules} from 'element-plus';
  4. // 导入 ElForm 组件的实例类型
  5. interface FormModel {
  6. name: string;
  7. age: string;
  8. sex: string;
  9. }
  10. const form = reactive<FormModel>({
  11. name: 'BO',
  12. age: '',
  13. sex: ''
  14. });
  15. const formRules = {
  16. name: [
  17. { required: true, message: '请输入姓名', trigger: 'blur' },
  18. { min: 2, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
  19. ],
  20. age: [
  21. { required: true, message: '请输入年龄', trigger: 'blur' }
  22. ],
  23. sex: [
  24. { required: true, message: '请选择性别', trigger: 'change' }
  25. ]
  26. };
  27. const formRef = ref<FormInstance>()
  28. // 定义表单引用并赋予正确类型
  29. const resetForm = (formEl: FormInstance | undefined) => {
  30. if (!formEl) return
  31. formEl.resetFields()
  32. }
  33. const submitForm = async (formEl: FormInstance | undefined) => {
  34. if (!formEl) return
  35. await formEl.validate((valid, fields) => {
  36. if (valid) {
  37. console.log('submit!')
  38. console.log(form)
  39. formEl.resetFields()
  40. } else {
  41. console.log('error submit!', fields)
  42. }
  43. })
  44. }
  45. </script>
  46. <template>
  47. <div>
  48. <H3>这是B界面</H3>
  49. <el-form :model="form" :rules = "formRules" ref ="formRef">
  50. <el-form-item label="姓名" prop="name">
  51. <el-input v-model="form.name" />
  52. </el-form-item>
  53. <el-form-item label="年龄" prop="age">
  54. <el-input v-model="form.age"/>
  55. </el-form-item>
  56. <el-form-item label="性别" prop="sex">
  57. <el-select v-model="form.sex" placeholder="请选择性别">
  58. <el-option label="男" value="男" />
  59. <el-option label="女" value="女" />
  60. </el-select>
  61. </el-form-item>
  62. <el-form-item>
  63. <el-button type="primary" @click="submitForm(formRef)">提交</el-button>
  64. <el-button @click="resetForm(formRef)">重置</el-button>
  65. </el-form-item>
  66. </el-form>
  67. </div>
  68. </template>

3.3表格

边框,宽度,固定列

  1. 表格属性:
  2. border:是否带有纵向边框
  3. data:表格使用的数据,自动渲染
  4. 列属性:
  5. prop: 键名,对应数据中的字段
  6. label:列名
  7. width:列宽度
  8. fixed:列是否固定在左侧或者右侧, true 表示固定在左侧
  9. fixed= "right"

卡片

悬浮展示数据,类似于卡片效果。

详情请见卡片

6e3e6056fc144a7f9e4a6aa4fcb03d29.png

  1. <script setup lang="ts">
  2. import { ref, reactive } from 'vue';
  3. const tableData = [
  4. {
  5. date: '2016-05-03',
  6. name: 'Tom',
  7. address: 'No. 189, Grove St, Los Angeles',
  8. },
  9. {
  10. date: '2016-05-02',
  11. name: 'Tom',
  12. address: 'No. 189, Grove St, Los Angeles',
  13. },
  14. {
  15. date: '2016-05-04',
  16. name: 'Tom',
  17. address: 'No. 189, Grove St, Los Angeles',
  18. },
  19. {
  20. date: '2016-05-01',
  21. name: 'Tom',
  22. address: 'No. 189, Grove St, Los Angeles',
  23. },
  24. ]
  25. </script>
  26. <template>
  27. <div>
  28. <el-card class="box-card">
  29. <template #header>
  30. <div class="card-header">
  31. <span>用户列表</span>
  32. </div>
  33. </template>
  34. <el-button type="primary">新增数据</el-button>
  35. <div style="margin:0 10px">
  36. <el-table :data="tableData" style="width: 100%">
  37. <el-table-column prop="date" label="日期" width="180" align = 'center' />
  38. <el-table-column prop="name" label="姓名" width="180" align = 'center'/>
  39. <el-table-column prop="address" label="地址" align = 'center'/>
  40. </el-table>
  41. </div>
  42. </el-card>
  43. </div>
  44. </template>

弹窗

4cba7bf14c354d8697a41c5d30686fa2.png

  1. <script setup lang="ts">
  2. import { computed, ref, reactive, watch } from 'vue';
  3. import { ElMessage, ElMessageBox } from 'element-plus'
  4. const dialogFormVisible = ref(false)
  5. const GlobalIndex = ref(-1)
  6. const name = ref('')
  7. interface User {
  8. name: string;
  9. city: string;
  10. age: number;
  11. }
  12. const tableData = reactive<Array<User>>([
  13. {
  14. date: '2016-05-03',
  15. name: 'Tom1',
  16. address: 'No. 189, Grove St, Los Angeles',
  17. },
  18. {
  19. date: '2016-05-02',
  20. name: 'Tom2',
  21. address: 'No. 189, Grove St, Los Angeles',
  22. },
  23. {
  24. date: '2016-05-04',
  25. name: 'Tom3',
  26. address: 'No. 189, Grove St, Los Angeles',
  27. },
  28. {
  29. date: '2016-05-01',
  30. name: 'Tom4',
  31. address: 'No. 189, Grove St, Los Angeles',
  32. },
  33. ])
  34. const now = reactive(new Date());
  35. let form = reactive({
  36. date: now.toISOString().substring(0, 10),
  37. name: '',
  38. address: '',
  39. })
  40. const handeAdd = () => {
  41. form = reactive({
  42. date: now.toISOString().substring(0, 10),
  43. name: '',
  44. address: '',
  45. })
  46. dialogFormVisible.value = true
  47. }
  48. const save = () => {
  49. if(GlobalIndex.value >=0){
  50. console.log(GlobalIndex.value)
  51. tableData[GlobalIndex.value] = form
  52. GlobalIndex.value = -1
  53. }
  54. else{
  55. tableData.push(form)
  56. }
  57. dialogFormVisible.value = false
  58. }
  59. const handleEdit = (row,index) => {
  60. const newobj = Object.assign({}, row)
  61. form = reactive(newobj)
  62. GlobalIndex.value = index
  63. dialogFormVisible.value = true
  64. }
  65. const handleDelete = (index: number) => {
  66. ElMessageBox.confirm('是否删除该条数据?', '提示', {
  67. confirmButtonText: '确定',
  68. cancelButtonText: '取消',
  69. type: 'warning'
  70. }).then(() => {
  71. tableData.splice(index, 1); // 删除指定索引的数据
  72. ElMessage({
  73. type: 'success',
  74. message: '删除成功!'
  75. });
  76. }).catch(() => {
  77. ElMessage({
  78. type: 'info',
  79. message: '已取消删除'
  80. });
  81. });
  82. };
  83. // 搜索关键字状态管理
  84. const searchValue = ref('');
  85. // 定义计算属性,根据搜索关键字过滤表格数据
  86. const filterTableData = computed(() =>
  87. tableData.filter(
  88. (data) =>
  89. !searchValue.value ||
  90. data.name.toLowerCase().includes(searchValue.value.toLowerCase())
  91. )
  92. );
  93. // 监听 searchValue 的变化
  94. watch(searchValue, (newValue, oldValue) => {
  95. if (!newValue) {
  96. filterTableData.value = tableData;
  97. }
  98. });
  99. // 搜索功能的实现
  100. const search = () => {
  101. searchValue.value = name.value;
  102. console.log(searchValue.value); // 更新搜索关键字为输入框的值
  103. };
  104. </script>
  105. <template>
  106. <div>
  107. <el-card class="box-card">
  108. <template #header>
  109. <div class="card-header">
  110. <span>用户列表</span>
  111. </div>
  112. </template>
  113. <!-- Element UI Input 组件,用于输入搜索名称 -->
  114. <el-input style="width:300px" placeholder="请输入名称" v-model="name" clearable></el-input>
  115. <!-- Element UI 主题样式按钮,点击后执行搜索动作 -->
  116. <el-button type="primary" @click="search" style="margin-left:5px">搜索</el-button>
  117. <el-button type="primary" @click="handeAdd" >新增数据</el-button>
  118. <div style="margin:0 10px">
  119. <el-table :data="filterTableData" style="width: 100%">
  120. <el-table-column prop="date" label="日期" sortable width="180" align = 'center' />
  121. <el-table-column prop="name" label="姓名" width="180" align = 'center'/>
  122. <el-table-column prop="address" label="地址" align = 'center'/>
  123. <el-table-column align = 'right'>
  124. <template #default="scope">
  125. <el-button link type="primary" size="small" @click="handleEdit(scope.row,scope.$index)"
  126. >编辑</el-button>
  127. <el-button link type="danger" size="small" @click.prevent="handleDelete(scope.$index)">删除</el-button>
  128. </template>
  129. </el-table-column>
  130. </el-table>
  131. </div>
  132. <el-dialog v-model="dialogFormVisible" title="信息" width="50%">
  133. <el-form :model="form" label-width="100px" style="padding-right: 30px;" >
  134. <el-form-item label="日期" >
  135. <el-input v-model="form.date" autocomplete="off" />
  136. </el-form-item>
  137. <el-form-item label="姓名" >
  138. <el-input v-model="form.name" autocomplete="off" />
  139. </el-form-item>
  140. <el-form-item label="地址" >
  141. <el-input v-model="form.address" autocomplete="off" />
  142. </el-form-item>
  143. </el-form>
  144. <template #footer>
  145. <div class="dialog-footer">
  146. <el-button @click="dialogFormVisible = false">取消</el-button>
  147. <el-button type="primary" @click="save">
  148. 确认
  149. </el-button>
  150. </div>
  151. </template>
  152. </el-dialog>
  153. </el-card>
  154. </div>
  155. </template>

分页·

详情请看分页

  1. const total = ref(10)
  2. const pageNum = ref(1)
  3. const pageSize = ref(1)
  4. <div style = "margin: 15px 0">
  5. <el-pagination background layout="sizes, prev, pager, next"
  6. v-model:current-page="pageNum"
  7. v-model:page-size="pageSize"
  8. :page-sizes="[1, 5,10]"
  9. :total="total"
  10. @size-change="load"
  11. @current-change="load"/>
  12. </div>

" class="reference-link">132788fad042496688a4fb4afa3d71ff.png

国际化

  1. import ElementPlus from 'element-plus'
  2. import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
  3. app.use(ElementPlus, {
  4. locale: zhCn,
  5. })

" class="reference-link">0540838e7ee845ed91c08777f0434f9b.png

日期选择器

详情请见日期选择器

  1. <el-date-picker
  2. v-model="value2"
  3. type="date"
  4. placeholder="Pick a day"
  5. :disabled-date="disabledDate"
  6. :shortcuts="shortcuts"
  7. :size="size"
  8. />

3.4轮播图

eafc601df1424e04a754c366823a1843.png

  1. <script setup lang="ts">
  2. import img1 from '@/assets/lunbo1.png';
  3. import img2 from '@/assets/lunbo2.png';
  4. import img3 from '@/assets/lunbo3.png';
  5. import img4 from '@/assets/lunbo4.png';
  6. const carouselData = [
  7. { url: img1 },
  8. { url: img2 },
  9. { url: img3 },
  10. { url: img4 },
  11. ]
  12. </script>
  13. <template>
  14. <div>
  15. <el-carousel :interval="4000" type="card" height="300px">
  16. <el-carousel-item v-for="item in carouselData" :key="item.url">
  17. <img :src="item.url" alt="轮播图片" style="width: 100%; height: 200px;"/>
  18. <h3>{
  19. { item.url }}</h3>
  20. </el-carousel-item>
  21. </el-carousel>
  22. </div>
  23. </template>
  24. <style>
  25. .el-carousel__item h3 {
  26. color: #475669;
  27. opacity: 0.75;
  28. line-height: 200px;
  29. margin: 0;
  30. text-align: center;
  31. }
  32. .el-carousel__item:nth-child(2n) {
  33. background-color: #99a9bf;
  34. }
  35. .el-carousel__item:nth-child(2n + 1) {
  36. background-color: #d3dce6;
  37. }
  38. </style>

3.5面包屑

详请参考https://juejin.cn/post/7087003440773070856

9275412e38a8417997e9271845a97ac1.png

路由

13c839b8004042bd9fdbd5ed927a2c53.png

  1. <template>
  2. <div class="breadcrumb">
  3. <!-- 使用 element-plus 的面包屑组件 -->
  4. <el-breadcrumb separator="/">
  5. <!-- 循环渲染面包屑导航项 -->
  6. <el-breadcrumb-item v-for="(crumb, index) in breadcrumbs" :key="index">
  7. <!-- 使用路由链接包装每个面包屑导航项 -->
  8. <router-link :to="crumb.to">{
  9. { crumb.title }}</router-link>
  10. </el-breadcrumb-item>
  11. </el-breadcrumb>
  12. </div>
  13. </template>
  14. <script setup lang="ts">
  15. // 导入所需的模块
  16. import { computed } from 'vue';
  17. import { useRouter } from 'vue-router';
  18. // 获取当前路由实例
  19. const router = useRouter();
  20. // 使用 computed 函数计算面包屑导航项
  21. const breadcrumbs = computed(() => {
  22. // 从当前路由匹配的规则中筛选出带有 isBreadcrumb 元信息的规则
  23. const matchedRoutes = router.currentRoute.value.matched.filter(route => route.meta && route.meta.isBreadcrumb);
  24. // 根据匹配到的路由规则生成面包屑导航项
  25. return matchedRoutes.map(route => ({
  26. to: route.path, // 面包屑导航项的链接路径
  27. title: route.meta.title, // 面包屑导航项的标题
  28. }));
  29. });
  30. </script>
  31. <style scoped>
  32. .breadcrumb {
  33. display: inline-flex;
  34. align-items: center;
  35. justify-content: flex-start;
  36. text-align: right;
  37. margin: 0 20px;
  38. flex: 1;
  39. }
  40. </style>

发表评论

表情:
评论列表 (有 0 条评论,130人围观)

还没有评论,来说两句吧...

相关阅读