【elementUI】自定义封装el-upload上传内容

文章目录

为实现如图所示功能,点击第一步弹出模态框,第二部将所有文件导入,第三步点击确定的时候上传到后台接口,封装一个组件
在这里插入图片描述
1.搭建template

 <div style="display: inline-block; margin-left: 10px;">
    <el-button type="warning"
               class="filter-item"
               icon="el-icon-upload"
               @click="uploadDialog">导入</el-button>
    <el-dialog title="提示"
               :visible.sync="uploadBox"
               width="30%">
      <el-upload class="upload-demo"
                 ref="uploadForm"
                 :http-request="upLoad"
                 action
                 multiple
                 drag
                 :before-remove="beforeRemove"
                 :file-list="fileList"
                 :auto-upload="false"
                 :limit="1">
        <i class="el-icon-upload"></i>
        <div class="el-upload__text">点击将文件传入</div>
      </el-upload>
      <span slot="footer"
            class="dialog-footer">
        <el-button @click="uploadBox = false">取 消</el-button>
        <el-button type="primary"
                   @click="submitUpload">确 定</el-button>
      </span>
    </el-dialog>
  </div>

阅读官方文档可知,主要的参数属性为:

action:必选参数,上传的地址,string类型

为实现自定义上传的内容,即上传的网址为后端提供的接口,需要修改如下属性:

http-request:覆盖默认的上传行为,可以自定义上传的实现

为实现第三步,点击确定之后再上传,需要修改的属性为:

auto-upload:是否在选取文件后立即进行上传,改为false

其他限制属性(以本文为例):

multiple 是否支持多选文件 boolean
drag 是否启用拖拽上传 boolean
before-remove 删除文件之前的钩子,参数为上传的文件和文件列表,若返回 false 或者返回 Promise 且被 reject,则停止删除。 function(file, fileList)
limit 最大允许上传个数 number
file-list 上传的文件列表, 例如: [{name: ‘food.jpg’, url: ‘https://xxx.cdn.com/xxx.jpg’}] array

其他属性可见elementUI官方网站

2.需要从父级接收到需要上传的网址,本文还封装了一下axios
api/api.js文件

export function getUpload (url, data) {
  return request({
    method: 'post',
    url,
    data
  })
}

getOrderList:为列表渲染的方法

完整代码

<template>
  <div style="display: inline-block; margin-left: 10px;">
    <el-button type="warning"
               class="filter-item"
               icon="el-icon-upload"
               @click="uploadDialog">导入</el-button>
    <el-dialog title="提示"
               :visible.sync="uploadBox"
               width="30%">
      <el-upload class="upload-demo"
                 ref="uploadForm"
                 :http-request="upLoad"
                 action
                 multiple
                 drag
                 :before-remove="beforeRemove"
                 :file-list="fileList"
                 :auto-upload="false"
                 :limit="1">
        <i class="el-icon-upload"></i>
        <div class="el-upload__text">点击将文件传入</div>
      </el-upload>
      <span slot="footer"
            class="dialog-footer">
        <el-button @click="uploadBox = false">取 消</el-button>
        <el-button type="primary"
                   @click="submitUpload">确 定</el-button>
      </span>
    </el-dialog>
  </div>
</template>

<script>
import { getUpload } from '@/api/api';
export default {
  props: ['url', 'getOrderList'],
  data () {
    return {
      //点击导入的内容
      fileList: [],
      //弹出传入文件的框
      uploadBox: false
    }
  },

  methods: {
    beforeRemove (file, fileList) {
      // 文件列表移出之前的钩子
      return this.$confirm(`确定移除 ${file.name}`);

    },

    upLoad (item) {
      const loading = this.$loading({
        lock: true,
        text: 'Loading',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      });
      let formDatas = new FormData();
      formDatas.append('file', item.file)


      getUpload(this.url, formDatas).then(res => {
        loading.close();
        if (res.data.code == 0) {
          this.$message({
            message: '上传成功',
            type: 'success'
          });
          this.fileList = []
          this.getOrderList()
        } else {
          loading.close();
          this.$message({
            message: "上传失败",
            type: 'error'
          });
          this.fileList = []
        }
      })
    },
    //弹出要传入的模态框
    uploadDialog () {
      this.uploadBox = true
    },
    submitUpload () {
      this.$refs.uploadForm.submit();
      this.uploadBox = false;



    }
  }

}
</script>

<style>
</style>

如果没有对axios进行二次封装,upLoad中的方法可以写为:

  upLoad (item) {
      const loading = this.$loading({
        lock: true,
        text: 'Loading',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      });
      let formDatas = new FormData();
      formDatas.append('file', item.file)


      axios.post(this.url, formDatas).then(res => {
        loading.close();
        if (res.data.code == 0) {
          this.$message({
            message: '上传成功',
            type: 'success'
          });
          this.fileList = []
          this.getOrderList()
        } else {
          loading.close();
          this.$message({
            message: "上传失败",
            type: 'error'
          });
          this.fileList = []
        }
      })
    },
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 封装 el-upload 组件可以方便地在多个地方复用它,而不必在每个使用它的地方都编写一遍相同的代码。下面是一个简单的封装示例: ``` <template> <el-upload class="upload-demo" :action="action" :accept="accept" :before-upload="beforeUpload" :on-success="onSuccess" :on-error="onError" > <slot></slot> </el-upload> </template> <script> export default { name: 'MyUpload', props: { action: { type: String, required: true }, accept: { type: String, default: '' } }, methods: { beforeUpload(file) { // 在上传之前进行一些处理,例如限制文件大小等 // 如果返回 false 或 Promise.reject(),则取消上传 }, onSuccess(response, file, fileList) { // 上传成功后的回调函数 }, onError(error, file, fileList) { // 上传失败后的回调函数 } } } </script> ``` 在上面的示例中,我们使用了一个名为 `MyUpload` 的组件来封装 el-upload 组件。这个组件的 props 包括 `action` 和 `accept` 两个属性,分别代表上传文件的接口地址和可接受的文件类型。 在组件的方法中,我们实现了 `beforeUpload`、`onSuccess` 和 `onError` 三个回调函数,分别代表上传之前的处理、上传成功后的处理和上传失败后的处理。这些回调函数可以根据实际需求来编写。 在模板中,我们使用了一个 `slot` 来插入 el-upload 组件的上传按钮和提示信息,这样可以使组件更加灵活。在使用这个组件时,只需像下面这样调用: ``` <my-upload action="/upload" accept="image/*" v-on:success="handleSuccess" v-on:error="handleError" > <el-button>点击上传</el-button> <div slot="tip">只能上传图片</div> </my-upload> ``` 在上面的示例中,我们将 `MyUpload` 组件用 `my-upload` 标签来调用。在组件中,我们使用了 `v-on` 指令来监听上传成功和失败事件,并分别调用了 `handleSuccess` 和 `handleError` 方法来处理这些事件。在组件的插槽中,我们自定义上传按钮和提示信息。 ### 回答2: el-uploadelement-ui中的一个上传组件,用于实现文件上传功能。封装el-upload组件的目的是为了方便在项目中重复使用它,并且可以根据项目的特殊需求进行个性化配置和定制。 在封装el-upload组件时,可以使用mixin混入的方式来实现。首先,我们可以定义一个uploadMixin对象,其中包含一些常用的配置项和方法,如上传文件的接口地址、上传文件的类型限制、上传成功后的回调函数等。 然后,在需要使用el-upload组件的地方,引入uploadMixin,并在组件的mixins选项中将uploadMixin添加进去。这样,就可以继承uploadMixin中的配置和方法,实现el-upload的定制化使用。 在具体使用el-upload组件时,可以根据具体需求,配置一些参数,比如是否支持多文件上传、是否显示文件列表、是否自动上传等。同时,也可以通过监听el-upload的事件来实现一些额外的逻辑操作,比如文件上传前的校验、进度条的展示等。 通过封装el-upload组件,可以抽象出一些通用的上传行为和样式,减少重复代码的编写,提高开发效率。同时,也方便后续对上传功能的扩展和维护,在项目的后续需求变更时,只需要对封装好的组件进行相应的配置和调整,而不需要对每个使用el-upload组件的地方进行修改。 总之,封装el-upload组件能够提升代码的复用性和可维护性,减少开发成本,提高开发效率。 ### 回答3: el-upload是基于element-ui封装的文件上传组件,使用它可以方便地实现文件的上传和管理。在进行封装时,可以根据实际需求添加一些额外的功能,以增强其功能性和便利性。 在封装el-upload组件时,可以考虑以下几个要点: 1. 文件类型限制:可以设置允许上传的文件类型,如限制只能上传图片、文档、压缩包等特定类型的文件。 2. 文件大小限制:可以限制上传文件的最大大小,以防止用户上传过大的文件。 3. 上传进度条:可以添加一个上传进度条,用于显示文件上传的进度,提升用户体验。 4. 文件预览功能:可以在上传文件后,提供文件预览的功能,例如图片可以直接显示预览,文档可以提供下载链接等。 5. 多文件上传:可以支持多个文件同时上传,并正确处理每个文件的上传结果。 6. 文件删除功能:在文件上传后,提供删除已上传文件的功能,以方便用户删除不需要的文件。 7. 自定义样式:可以设置上传按钮的样式、进度条的颜色等,以适应项目的整体风格。 8. 错误处理:对于上传过程中的错误,可以提供友好的错误提示,同时对异常情况进行处理和回馈给用户。 通过封装el-upload组件,可以减少重复的代码编写工作,提高代码的复用性和可维护性。同时,组件的封装可以使得开发人员更加专注于实际业务逻辑的实现,提升开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值