二次封装 Element UI 的上传图片组件,使其支持文件回显
【代码】二次封装 Element UI 的上传图片组件,使其支持文件回显。
·
<template>
<div class="image-uploader">
<el-upload
class="image-uploader"
:action="uploadUrl"
:show-file-list="false"
:on-success="handleUploadSuccess"
:before-upload="beforeUpload"
>
<img v-if="imageUrl" :src="imageUrl" class="image">
<i v-else class="el-icon-plus image-uploader-icon"></i>
</el-upload>
</div>
</template>
<script>
export default {
name: 'ImageUploader',
props: {
value: {
type: String,
default: ''
},
uploadUrl: {
type: String,
required: true
}
},
data() {
return {
imageUrl: ''
}
},
watch: {
value: {
immediate: true,
handler(newVal) {
this.imageUrl = newVal
}
}
},
methods: {
handleUploadSuccess(res, file) {
this.imageUrl = URL.createObjectURL(file.raw)
this.$emit('input', res.url) // 假设服务器返回的是 { url: '图片URL' }
},
beforeUpload(file) {
const isImage = file.type.startsWith('image/')
const isLt2M = file.size / 1024 / 1024 < 2
if (!isImage) {
this.$message.error('上传文件只能是图片格式!')
}
if (!isLt2M) {
this.$message.error('上传图片大小不能超过 2MB!')
}
return isImage && isLt2M
}
}
}
</script>
<style scoped>
.image-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.image-uploader .el-upload:hover {
border-color: #409EFF;
}
.image-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
line-height: 178px;
text-align: center;
}
.image {
width: 178px;
height: 178px;
display: block;
}
</style>
这个组件封装了 Element UI 的上传组件,并添加了一些额外的功能:
- 使用 v-model 进行双向绑定
- 支持图片预览和回显
- 添加了文件类型和大小的验证
使用这个组件的方法如下:
<template>
<div>
<image-uploader v-model="imageUrl" :upload-url="uploadUrl" />
</div>
</template>
<script>
import ImageUploader from './ImageUploader.vue'
export default {
components: {
ImageUploader
},
data() {
return {
imageUrl: '',
uploadUrl: 'https://your-upload-api.com/upload'
}
}
}
</script>
这个组件的主要特点是:
- 通过 v-model 绑定图片 URL,实现了上传和回显的双向绑定。
- 支持图片预览,如果有 imageUrl,会显示图片,否则显示上传图标。
- 在上传成功后,会更新 imageUrl 并触发 input 事件,从而更新父组件中的值。
- 包含了基本的文件验证,确保只能上传图片文件,且大小不超过 2MB。
更多推荐
所有评论(0)