基于若依框架和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 上传组件的基础功能,又增加了业务所需的定制化能力。
相关推荐
Howrun7771 小时前
VSCode烦人的远程交互UI讲解
ide·vue.js·vscode
百锦再1 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
莲华君1 小时前
React快速上手:从零到项目实战
前端·reactjs教程
百锦再1 小时前
React编程高级主题:测试代码
android·前端·javascript·react.js·前端框架·reactjs
易安说AI2 小时前
Ralph Loop 让Claude无止尽干活的牛马...
前端·后端
JH30732 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
失忆爆表症3 小时前
05_UI 组件库集成指南:Shadcn/ui + Tailwind CSS v4
前端·css·ui
小迷糊的学习记录3 小时前
Vuex 与 pinia
前端·javascript·vue.js
发现一只大呆瓜4 小时前
前端性能优化:图片懒加载的三种手写方案
前端·javascript·面试
不爱吃糖的程序媛4 小时前
Flutter 与 OpenHarmony 通信:Flutter Channel 使用指南
前端·javascript·flutter