<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 的上传组件,并添加了一些额外的功能:

  1. 使用 v-model 进行双向绑定
  2. 支持图片预览和回显
  3. 添加了文件类型和大小的验证

使用这个组件的方法如下:

<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>

这个组件的主要特点是:

  1. 通过 v-model 绑定图片 URL,实现了上传和回显的双向绑定。
  2. 支持图片预览,如果有 imageUrl,会显示图片,否则显示上传图标。
  3. 在上传成功后,会更新 imageUrl 并触发 input 事件,从而更新父组件中的值。
  4. 包含了基本的文件验证,确保只能上传图片文件,且大小不超过 2MB。
Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐