基于若依框架和Vue2 + Element-UI 实现图片上传组件的重写与优化

背景

在使用 若依分离版Element-UI 的图片上传组件时,需要根据业务需求进行定制化处理,比如:

  1. 需要传递额外的业务参数到后端
  2. 需要对上传路径进行修改
  3. 需要对上传组件进行样式定制

实现步骤

1. 创建本地组件

首先在业务模块下创建本地的图片上传组件:

java 复制代码
src/views/xxx/components/ImageUpload/index.vue

2. 组件核心代码

java 复制代码
<template>
  <div class="component-upload-image">
    <el-upload
      multiple
      :action="uploadImgUrl"
      :data="{
        bizType: bizType  // 传递业务参数
      }"
      list-type="picture-card"
      :on-success="handleUploadSuccess"
      :before-upload="handleBeforeUpload"
      :headers="headers"
      :file-list="fileList"
      <!-- 其他属性 -->
    >
      <i class="el-icon-plus"></i>
    </el-upload>
  </div>
</template>

<script>
export default {
  name: 'ImageUpload',
  props: {
    value: {
      type: String,
      default: ''
    },
    // 业务类型参数
    bizType: {
      type: String,
      default: 'changeImages'
    }
  },
  data() {
    return {
      uploadImgUrl: process.env.VUE_APP_BASE_API + "/adminCommon/upload", // 自定义上传地址
      headers: {
        Authorization: "Bearer " + getToken()
      }
    }
  }
}
</script>

3. 注册使用

在父组件中注册并使用本地组件:

java 复制代码
<script>
import ImageUpload from './components/ImageUpload/index.vue'

export default {
  components: {
    LocalImageUpload: ImageUpload  // 注册为本地组件
  }
}
</script>

<template>
  <LocalImageUpload 
    v-model="form.imagesImg"
    :bizType="'xxx'"   // 业务参数值
  />
</template>

4. 禁用全局组件

在 main.js 中注释掉全局组件的注册(如果有其他地方使用则不需要注释):

java 复制代码
// 注释掉全局图片上传组件
// Vue.component('ImageUpload', ImageUpload)

5.后端接收

java 复制代码
public AjaxResult uploadFile(MultipartFile file , @RequestParam("bizType") String bizType) throws Exception{}

核心优化点

1.参数传递

  • 通过 props 定义业务参数
  • 使用 el-upload 的 data 属性传递参数到后端

2.上传地址

  • 自定义上传地址
  • 支持环境变量配置

3.文件验证

  • 支持文件类型验证
  • 支持文件大小限制
  • 支持上传数量限制

4.交互优化

  • 上传前预检查
  • 上传中loading提示
  • 上传成功/失败提示
  • 预览功能

使用示例

java 复制代码
<!-- 在表单中使用 -->
<el-form-item label="图片" prop="imagesImg">
  <LocalImageUpload 
    v-model="form.imagesImg"
    :bizType="'xxx'"
  />
</el-form-item>

<!-- 在表格中使用 -->
<el-table-column label="图片" align="center" prop="imagesImg">
  <template slot-scope="scope">
    <LocalImageUpload 
      v-model="scope.row.imagesImg"
      :bizType="'xxx'"
    />
  </template>
</el-table-column>

优势

  1. 更灵活的参数传递
  2. 更好的代码组织
  3. 更容易维护和扩展
  4. 避免全局污染
  5. 支持业务定制化
  6. 这样的组件重写既保留了 Element-UI 上传组件的基础功能,又增加了业务所需的定制化能力。
相关推荐
bin91531 小时前
DeepSeek 助力 Vue 开发:打造丝滑的复制到剪贴板(Copy to Clipboard)
前端·javascript·vue.js·ecmascript·deepseek
晴空万里藏片云3 小时前
elment Table多级表头固定列后,合计行错位显示问题解决
前端·javascript·vue.js
曦月合一3 小时前
html中iframe标签 隐藏滚动条
前端·html·iframe
Tirzano3 小时前
springsecurity自定义认证
spring boot·spring
奶球不是球3 小时前
el-button按钮的loading状态设置
前端·javascript
kidding7233 小时前
前端VUE3的面试题
前端·typescript·compositionapi·fragment·teleport·suspense
Σίσυφος19005 小时前
halcon 条形码、二维码识别、opencv识别
前端·数据库
学代码的小前端5 小时前
0基础学前端-----CSS DAY13
前端·css
bing_1586 小时前
简单工厂模式 (Simple Factory Pattern) 在Spring Boot 中的应用
spring boot·后端·简单工厂模式
css趣多多6 小时前
案例自定义tabBar
前端