Vue3+elementplus实现图片上传下载(最强实践)

本文主要是介绍Vue3+elementplus实现图片上传下载(最强实践),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 图片上传子组件:

实现照片的上传,预览,以及转成以逗号隔开的图片地址,即时监听,并发送消息到父组件。

<!-- ImageUploader.vue -->  
<template><div><el-upload class="avatar-uploader" :http-request="customUpload" :before-upload="beforeUpload":show-file-list="false" multiple><el-icon><Plus style="background-color: azure;" /></el-icon></el-upload><div v-for="(image, index) in imageUrls" :key="index"><el-image :src="image" style="width: 100px; height: 100px" fit="cover" :preview-src-list="[image]"><template #placeholder><div class="image-slot">Loading<span class="dot">...</span></div></template></el-image><el-button @click="deleteImage(image)" el-icon=""><el-icon><DeleteFilled /></el-icon></el-button></div></div>
</template>  <script setup lang="ts" name="ImageUploader">
import { computed, ref, watch } from 'vue';
import { upload } from '@/api/file'
import { ElMessage } from 'element-plus'
import emitter from '@/utils/emitter'// 上传文件,请求接口,并且将结果存储
function customUpload(file: any) {let formData = new FormData();formData.append('file', file.file)upload(formData).then((response: any) => {const imgUrl = response.data;imageUrls.value.push(imgUrl);})
}// 图片url
const imageUrls = ref([]);// 计算属性,用于生成逗号隔开的图片地址字符串  
const commaSeparatedUrls = computed(() => imageUrls.value.join(','));
// 监听图片地址变化,即时发送最新数据给父组件
watch(imageUrls, () => {console.log('发送图片地址', commaSeparatedUrls.value)emitter.emit('send-imageUrls', commaSeparatedUrls.value)
}, { deep: true })// 图片校验规则
const beforeUpload = (file: any) => {const isJPGOrPNG = file.type === 'image/jpeg' || file.type === 'image/png';const isLt2M = file.size / 1024 / 1024 < 2;if (!isJPGOrPNG) {ElMessage.error('picture must be jpg/png format!')return false}if (!isLt2M) {ElMessage.error('picture size can not exceed 2MB!')return false}return true
};// 删除图片
const deleteImage = (imgUrl: any) => {// 从imageUrls数组中删除指定的图片URL  imageUrls.value.splice(imgUrl, 1);
};</script>  <style scoped> .avatar-uploader {color: skyblue;font-style: normal;}
</style>

表单父组件:

引入图片上传子组件,接受消息,并实现挂载之后取消绑定事件,避免占用内存 

<template><el-form ref="ruleFormRef" style="max-width: 600px" :model="ruleForm" :rules="rules" label-width="auto"class="demo-ruleForm" :size="formSize" status-icon><el-form-item label="类型"><el-radio-group v-model="ruleForm.type"><el-radio value="0">转租</el-radio><el-radio value="1">短租</el-radio><el-radio value="2">长租</el-radio><el-radio value="3">招租</el-radio></el-radio-group></el-form-item><el-form-item label="标题" prop="tittle"><el-input v-model="ruleForm.tittle" /></el-form-item><el-form-item label="地址" prop="address"><el-input v-model="ruleForm.address" /></el-form-item><el-form-item label="介绍" prop="content"><el-input v-model="ruleForm.content" /></el-form-item><el-form-item label="房间照片"><ImageUploader /></el-form-item><el-form-item><el-button type="primary" @click="submitForm(ruleFormRef)">Create</el-button><el-button @click="resetForm(ruleFormRef)">Reset</el-button></el-form-item></el-form>
</template><script lang="ts" setup>
import { reactive, ref, onUnmounted } from 'vue'
import type { ComponentSize, FormInstance, FormRules } from 'element-plus'
import { type HouseInter } from '@/types/model';
import emitter from '@/utils/emitter'
import ImageUploader from '@/components/ImageUploader.vue'const formSize = ref<ComponentSize>('default')
const ruleFormRef = ref<FormInstance>()
const ruleForm = reactive<HouseInter>({})const rules = reactive<FormRules<HouseInter>>({type: [{ required: true, message: '请选择房源类型', trigger: 'change' }],tittle: [{ required: true, message: '请填写标题', trigger: 'change' }],})// 接受图片上传子组件的图片地址最新消息
emitter.on('send-imageUrls', (value: string) => {ruleForm.housePhoto = valueconsole.log('接收图片地址', ruleForm.housePhoto)
})
onUnmounted(() => {// 组件卸载之后,解绑事件emitter.off('send-imageUrls')
})const submitForm = async (formEl: FormInstance | undefined) => {if (!formEl) returnawait formEl.validate((valid, fields) => {if (valid) {console.log('submit!')} else {console.log('error submit!', fields)}})
}const resetForm = (formEl: FormInstance | undefined) => {if (!formEl) returnformEl.resetFields()
}
</script><style scoped></style>

消息工具类

import mitt from 'mitt'
import { ref } from 'vue'let emitter = mitt()let num = ref(0)// 绑定事件
emitter.on('add', () => {console.log('add被调用了', num)
})
// 每隔1秒执行事件
setInterval(() => {// emitter.emit('add')
}, 1000)setTimeout(() => {// 解绑事件emitter.off('add')
}, 5000)export default emitter

这篇关于Vue3+elementplus实现图片上传下载(最强实践)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147100

相关文章

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

Python xmltodict实现简化XML数据处理

《Pythonxmltodict实现简化XML数据处理》Python社区为提供了xmltodict库,它专为简化XML与Python数据结构的转换而设计,本文主要来为大家介绍一下如何使用xmltod... 目录一、引言二、XMLtodict介绍设计理念适用场景三、功能参数与属性1、parse函数2、unpa

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的