news 2026/7/7 20:11:32

12.15 element-plus的一些组件(上)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
12.15 element-plus的一些组件(上)

El-Plus的面包屑导航组件

<template> <el-breadcrumb separator="/"> <el-breadcrumb-item :to="{ path: '/' }">homepage</el-breadcrumb-item> <el-breadcrumb-item> <a href="/">promotion management</a> </el-breadcrumb-item> <el-breadcrumb-item>promotion list</el-breadcrumb-item> <el-breadcrumb-item>promotion detail</el-breadcrumb-item> </el-breadcrumb> </template>

面包屑动态渲染

数据结构

// 面包屑列表 // 首页 / 学生管理 / 学员管理 const list = ref([ { title: '首页', path: '/dashboard/console' }, { title: '学生管理', path: '/student/classAdmin' }, { title: '学员管理', path: '/student/studentAdmin' } ])

动态渲染

<template> <el-breadcrumb separator="/"> <el-breadcrumb-item v-for="item in list" :to="{ path: item.path }" > {{item.title}} </el-breadcrumb-item> </el-breadcrumb> </template>

监听路由变化

import { watch,ref } from 'vue'; import { useRoute } from 'vue-router' const route = useRoute() //监听路由变化 watch(route, (to) => { console.log(to) //路由记录 }, { immediate: true })

需求分析

/** 分类讨论: 进入首页 /dashboard/console to.matched[0].path = ‘/dashboard/console’ 进入只有一级菜单的路由 /notice/index breadcrumbList:[‘公告管理’] 进入有二级菜单的路由 /echarts/bar breadcrumbList: [‘图表管理’,'柱状图] */

代码实现

//监听路由变化 watch(route, (to) => { //每次切换路由时,清空以前的列表,只保留首页 list.value = [{ title: '首页', path: '/dashboard/console' }] // 如果path= '/dashboard/console',则说明当前是首页,不需要处理 if (to.fullPath === '/dashboard/console') return; //只有一级菜单,则只添加一次 if (to.matched[0].children.length === 1) { list.value.push({ title: to.meta.title, path: to.fullPath }) return; } else { //有二级菜单 to.matched.forEach(item => { let path; // /首页/学生管理/班级管理 (学生管理下的第一个菜单 ) // /首页/学生管理/学员管理 // 如上,单击学生管理,应该跳转至班级管理,所以在学生管理的路由配置中添加 // meta { // home: '/student/studentAdmin' // } if (item.meta.home){ path = item.meta.home }else{ path = item.fullPath } list.value.push({ title: item.meta.title, path }) }) } }, { immediate: true })

实现国际化代码

<script lang="ts" setup> import { computed, ref } from 'vue' import zhCn from 'element-plus/dist/locale/zh-cn.mjs' import en from 'element-plus/dist/locale/en.mjs' const language = ref('zh-cn') const locale = computed(() => (language.value === 'zh-cn' ? zhCn : en)) const toggle = () => { language.value = language.value === 'zh-cn' ? 'en' : 'zh-cn' } </script> <template> <el-config-provider :locale="locale"> <el-date-picker type="date" placeholder="Pick a date" :default-value="new Date(2010, 9, 1)" /> </el-config-provider> </template>

日期组件国际化【添加中英文切换功能】

**国际化之前

![[360X360.PNG]]

**国际化之后

![[360X360 (1).PNG]]

添加中英文切换功能

图片上传

创建上传图片的组件

在upload/index.vue

<script setup> </script> <template> <div class="upload"> 图片上传 </div> </template> <style lang="scss" scoped> </style>

添加路由

// 文件上传-一级路由 { path: '/upload', name: 'upload', component: () => import('@/pages/layout/index.vue'), children:[{ // /moreLang/index path: 'index', name: 'uploadimg', component: () => import('@/pages/upload/index.vue'), }] },

配置图片上传模板

<script setup> import { ref, reactive } from 'vue' import { ElMessage } from 'element-plus' const imageUrl = ref('') // 通过header头传递token const headers = ref({ "Authorization": "Bearer " + sessionStorage.getItem('token') }); // 上传成功之后的处理方法 const handleAvatarSuccess = (response, uploadFile) => { imageUrl.value = URL.createObjectURL(uploadFile.raw) } // 上传之前的格式验证:是否为图片,大小是否在2MB const beforeAvatarUpload = (rawFile) => { if (rawFile.type !== 'image/jpeg') { ElMessage.error('Avatar picture must be JPG format!') return false } else if (rawFile.size / 1024 / 1024 > 2) { ElMessage.error('Avatar picture size can not exceed 2MB!') return false } return true } </script> <template> <!-- action:后端的路径地址 show-file-list:是否显示上传成功的文件列表 on-success:当文件上传成功之后 before-upload:文件上传之前 headers:添加headers值,里面主要用来添加token --> <el-upload class="avatar-uploader" action="/api/upload" :show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload" :headers="headers"> <img v-if="imageUrl" :src="imageUrl" class="avatar" /> <el-icon v-else class="avatar-uploader-icon"> <Plus /> </el-icon> </el-upload> </template> <style scoped> .avatar-uploader .avatar { width: 178px; height: 178px; display: block; } </style> <style> .avatar-uploader .el-upload { border: 1px dashed var(--el-border-color); border-radius: 6px; cursor: pointer; position: relative; overflow: hidden; transition: var(--el-transition-duration-fast); } .avatar-uploader .el-upload:hover { border-color: var(--el-color-primary); } .el-icon.avatar-uploader-icon { font-size: 28px; color: #8c939d; width: 178px; height: 178px; text-align: center; } </style>

注意:如果想要自定义上传方式,可以使用下面方式

<el-upload class="avatar-uploader" action="#" :show-file-list="true" :http-request="changeHeader" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload" :headers="headers"> <img v-if="imageUrl" :src="imageUrl" class="avatar" /> <el-icon v-else class="avatar-uploader-icon"> <Plus /> </el-icon> </el-upload> <script> let changeHeader = async (params) => { let fileObject = params.file let pic = new FormData() pic.append('files', fileObject); let url = '/api/uploadImg' let config = { headers: { 'Content-Type': 'multipart/form-data' } } axios({ method: 'post', url: url, data: pic, config: config }).then(response => { console.log(response) }).catch(error => { console.log(error) }) } </script> # Tab标签页 ```HTML <script setup> /** * 分类讨论: * 1. 首次进入后台管理主页 ['首页'] * 2. 切换路由,先判断是否已存在, * 如果不存在则在tab标签上添加当前路由的标题 ['首页','公告管理','图片上传'] , 在标题上还要绑定路由, * 如果已经存在,则只需要获取路由对应的索引,处理高亮 * 3. 控制高亮 * 4. 删除: 当前标签从tabList中删除掉, */ import { watch, ref,Ref } from 'vue'; import { useRoute, useRouter } from 'vue-router'; const route = useRoute() const router = useRouter() interface IRoute{ fullPath:String, name?:String | any, path:String | any, title?:String } // tabList = [{},{},{}] const tabList:Ref = ref([]) const activeIndex = ref(0) //判断是否重复 const isRepeat = (to:IRoute) => { return tabList.value.some((item:IRoute) => item.path === to.fullPath) } watch(route, (to) => { console.log(to) //先判断是否重复 if (!isRepeat(to)) { //不重复 tabList.value.push({ title: to.meta.title, path: to.fullPath }) activeIndex.value = tabList.value.length - 1 } else { // 重复 activeIndex.value = tabList.value.findIndex((item:IRoute)=> item.path === to.fullPath) } }, { immediate: true }) //跳转 const jump = (item:IRoute) => { router.push(item.path) } //关闭 const handleClose = (index) => { //删除前面的 if (index < activeIndex.value) { tabList.value.splice(index, 1) activeIndex.value = activeIndex.value - 1 return; } if (index === activeIndex.value && index !== tabList.value.length - 1) { tabList.value.splice(index, 1) router.push(tabList.value[activeIndex.value].path) return; } //判断当前删除的是最后一个,而且是高亮的 if (index === tabList.value.length - 1 && index === activeIndex.value) { //是最后一个 tabList.value.splice(index, 1) activeIndex.value = tabList.value.length - 1 router.push(tabList.value[activeIndex.value].path) return; } //删后面的 if (index > activeIndex.value) { tabList.value.splice(index, 1) } } </script> <template> <div class="tabs"> <!-- <el-tag type="danger" closable>Tag 3</el-tag> <el-tag type="info" closable>Tag 3</el-tag> --> <el-tag v-for="(item, index) in tabList" :type="activeIndex === index ? 'danger' : 'info'" closable @click="jump(item)" @close="handleClose(index)">{{ item.title }}</el-tag> </div> </template> <style lang="scss" scoped></style>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 17:28:38

vue基于springboot的私人服装西服定制设计与实现沙箱支付

目录已开发项目效果实现截图开发技术介绍系统开发工具&#xff1a;核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&…

作者头像 李华
网站建设 2026/7/7 18:49:21

Java零基础入门讲解,从小白到大黑,收藏这篇就够了

目录 1. 什么是 Java&#xff1f;2. 配置 Java 开发环境 2.1 安装 JDK2.2 JDK 的组成2.3 集成开发环境的配置 2.3.1 设置 IDEA 主题2.3.2 设置 IDEA 字体2.3.3 设置 IDEA 背景色2.3.4 IDEA 常用快捷键2.3.5 IDEA 导入模块 3. Java 程序的结构4. 第一个 Java 程序5. Java 基础…

作者头像 李华
网站建设 2026/7/7 11:39:02

vue跨域前端怎么解决,零基础入门到精通,收藏这篇就够了

当我们遇到请求后台接口遇到 Access-Control-Allow-Origin 时&#xff0c;那说明跨域了。 跨域是因为浏览器的同源策略所导致&#xff0c;同源策略&#xff08;Same origin policy&#xff09;是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能&#xff0c;同源是指&…

作者头像 李华
网站建设 2026/7/6 21:26:29

Web前端开发,零基础入门到精通,收藏这篇就够了

文章目录 1. Web标准2. HTML 2.1 HTML 简介2.2 HTML 特点2.3 HTML 基本标签 3. CSS 3.1 CSS 简介3.2 CSS 引入方式3.3 CSS 选择器3.4 盒子模型3.5 CSS 基本属性 4. JavaScript 4.1 JavaScript 简介4.2 JS 引入方式4.3 JS 基础语法 4.3.1 书写语法4.3.2 变量4.3.3 数据类型4.3.…

作者头像 李华
网站建设 2026/7/7 15:38:08

vue基于springboot的农贸市场摊位商户管理信息系统设计与实现

目录已开发项目效果实现截图开发技术介绍系统开发工具&#xff1a;核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&…

作者头像 李华
网站建设 2026/7/7 10:59:23

EmotiVoice语音合成模型的热更新与无缝切换机制设计

EmotiVoice语音合成模型的热更新与无缝切换机制设计 在虚拟主播直播过程中&#xff0c;观众突然听到一声刺耳的爆音&#xff0c;随后主播的声音从温柔少女瞬间变成低沉大叔——这并非剧情设定&#xff0c;而是语音系统模型切换时出现了断裂。类似问题在智能客服、有声读物生成等…

作者头像 李华