Vue中图片上传组件封装-antd的a-upload二次封装的实例

一、背景

在Vue项目中,我们经常会使用上传图片的功能,而Ant Design Vue提供了一个非常方便的组件——a-upload,但是它的样式和功能可能无法满足我们的需求。因此,我们需要对它进行二次封装,定制我们需要的功能和样式。

二、封装步骤

  1. 创建一个Upload组件,在里面引入a-upload组件。
<template>
  <a-upload :show-upload-list="showUploadList" :multiple="multiple" :headers="headers" :action="action">
    <a-icon slot="upload-icon" type="plus" />
    <div class="ant-upload-text">{{ buttonText }}</div>
  </a-upload>
</template>
<script>
  import { Upload as AntdUpload, Icon } from 'ant-design-vue';
  export default {
    name: 'Upload',
    components: { 'a-upload': AntdUpload.Upload, 'a-icon': Icon },
    props: {
      showUploadList: {
        type: Boolean,
        default: true
      },
      multiple: {
        type: Boolean,
        default: false
      },
      headers: {
        type: Object,
        default: () => ({})
      },
      action: {
        type: String,
        default: ''
      },
      buttonText: {
        type: String,
        default: '上传'
      }
    }
  }
</script>

在使用a-upload组件时,我们可以通过props来传递需要的参数,例如:是否显示上传列表、是否可多选、上传时携带的header、上传接口、按钮上的文字等。

  1. 在Upload组件中增加上传之前的校验。
<template>
  <a-upload :show-upload-list="showUploadList" :multiple="multiple" :headers="headers" :before-upload="beforeUpload" :action="action">
    <a-icon slot="upload-icon" type="plus" />
    <div class="ant-upload-text">{{ buttonText }}</div>
  </a-upload>
</template>
<script>
  // ...props定义同上
  export default {
    // ...组件名、组件引用和props传递参数同上
    methods: {
      beforeUpload(file, fileList) {
        // 返回false可以阻止文件上传
        const isJPG = file.type === 'image/jpeg';
        const isPNG = file.type === 'image/png';
        const isBMP = file.type === 'image/bmp';
        const isGIF = file.type === 'image/gif';
        const isLt2M = file.size / 1024 / 1024 < 2;
        if (!(isJPG || isPNG || isBMP || isGIF)) {
          this.$message.error('请上传jpg、png、bmp、gif格式的图片');
          return false;
        }
        if (!isLt2M) {
          this.$message.error('上传的图片大小不能超过2MB');
          return false;
        }
        return true;
      }
    }
  }
</script>
  1. 在Upload组件中增加上传成功和上传失败的回调函数。
<template>
  <a-upload :show-upload-list="showUploadList" :multiple="multiple" :headers="headers" :before-upload="beforeUpload" :action="action" @success="onSuccess" @error="onError">
    <a-icon slot="upload-icon" type="plus" />
    <div class="ant-upload-text">{{ buttonText }}</div>
  </a-upload>
</template>
<script>
  // ...props定义和校验同上
  export default {
    // ...组件名、组件引用和props传递参数同上
    methods: {
      beforeUpload(file, fileList) {
        // ...校验代码同上
      },
      onSuccess(response, file, fileList) {
        this.$emit('success', response, file, fileList);
      },
      onError(error, response, file, fileList) {
        this.$emit('error', error, response, file, fileList);
        this.$message.error('上传失败');
      }
    }
  }
</script>

在上传成功和上传失败的回调函数中,我们可以通过this.$emit('success', response, file, fileList)来将上传成功的响应和相关的参数传递给父组件,父组件可监听@success事件来处理这些参数。对于上传失败的情况,我们在回调函数中弹出一个错误提示框。

  1. 在Upload组件中增加自定义样式。
<template>
  <a-upload :show-upload-list="showUploadList" :multiple="multiple" :headers="headers" :before-upload="beforeUpload" :action="action" @success="onSuccess" @error="onError">
    <a-icon slot="upload-icon" type="plus" />
    <div class="ant-upload-text">{{ buttonText }}</div>
  </a-upload>
</template>
<script>
  // ...props定义和校验、回调函数同上
  export default {
    // ...组件名、组件引用、props传递参数同上
    methods: {
      // ...校验、回调函数同上
    },
    mounted() {
      const uploadButton = this.$el.querySelector('.ant-upload');
      uploadButton.style.width = '128px';
      uploadButton.style.height = '128px';
      uploadButton.style.backgroundColor = '#f0f0f0';
    }
  }
</script>
<style scoped>
  .ant-upload-select-picture-card {
    display: inline-block;
    width: 128px;
    height: 128px;
    margin-bottom: 0;
    border: 1px dashed #d9d9d9;
    border-radius: 2px;
    transition: border-color .3s ease;
  }
  .ant-upload-select-picture-card:hover {
    border-color: #1890ff;
  }
  .ant-upload-text {
    margin-top: 8px;
    font-size: 12px;
    color: #666;
  }
  .ant-upload-list-item-actions {
    display: none;
  }
</style>

在样式中,我们修改了上传组件的宽高和边框样式,同时隐藏了上传列表项的删除按钮。

三、使用上传组件

我们在任意Vue组件中使用刚才封装好的Upload组件,用到的参数包括:是否显示上传列表、是否可多选、上传时携带的header、上传接口、按钮上的文字等。

<template>
  <div>
    <Upload :showUploadList="false" :multiple="true" :headers="headers" :action="action" @success="uploadSuccess" @error="uploadError" buttonText="上传图片" />
    <Button @click="handleUpload">上传</Button>
  </div>
</template>
<script>
  import Upload from '@/components/Upload';
  import { Button } from 'ant-design-vue';
  export default {
    name: 'Demo',
    components: { Upload, Button },
    data() {
      return {
        headers: {
          Authorization: 'Bearer token'
        },
        action: '/api/upload'
      }
    },
    methods: {
      uploadSuccess(response, file, fileList) {
        console.log(response);
      },
      uploadError(error, response, file, fileList) {
        console.log(error);
      },
      handleUpload() {
        const uploadInstance = this.$refs.upload;
        uploadInstance.$children[0].uploadFiles();
      }
    }
  }
</script>

上面的示例中,我们使用了Upload组件,并传递了需要的参数。在点击“上传”按钮时,我们获取到Upload组件实例,然后调用uploadFiles方法上传文件。

四、总结

通过以上步骤,我们成功地对a-upload组件进行了二次封装,提供了给定的上传功能并增加了一些自定义的功能和样式。在使用时,我们只需要传递需要的参数即可实现上传功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue中图片上传组件封装-antd的a-upload二次封装的实例 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • i7 8809G/8705G值得买吗?Intel AMD合体CPU i7-8705G/8809G对比深度评测

    当然,我可以为您提供一份关于i7-8705G和i7-8809G的对比深度评测攻略。以下是完整的攻略,包含两个示例说明: i7-8705G/8809G对比深度评测 1. 性能对比 示例说明一:CPU性能 i7-8705G和i7-8809G都是Intel和AMD合作推出的混合CPU,具备强大的计算能力。然而,i7-8809G采用了更高的基础频率和更大的缓存,因此…

    other 2023年10月17日
    00
  • iOS7如何关闭后台应用程序使用教程

    以下是详细讲解“iOS7如何关闭后台应用程序使用教程”的完整攻略。 1. 什么是后台应用程序? 后台应用程序是指在你按下Home键回到桌面时仍在工作的应用程序,相当于你让它暂时挂起,但并没有完全退出。 2. 如何关闭后台应用程序? 在iOS7中关闭后台应用程序的方法如下: 2.1 双击Home键 双击Home键,屏幕下方会出现已打开的应用程序列表,然后用手指…

    other 2023年6月25日
    00
  • JVM GC 垃圾收集梳理总结

    JVM GC 垃圾收集梳理总结 1. 什么是 JVM GC 垃圾收集 JVM(Java Virtual Machine)是Java虚拟机的缩写,它是Java程序运行的环境。在Java程序运行过程中,会产生一些不再被使用的对象,这些对象占用内存空间,如果不及时清理,会导致内存泄漏和程序性能下降。JVM的垃圾收集(Garbage Collection)机制就是用…

    other 2023年8月2日
    00
  • Ruby基本的环境变量设置以及常用解释器命令介绍

    下面是Ruby基本的环境变量设置以及常用解释器命令介绍的攻略: Ruby环境变量设置 PATH环境变量 在安装Ruby之后,我们需要将其添加到系统的PATH环境变量中,这样我们就可以直接使用命令行来调用Ruby。在Windows系统下,可以按如下步骤进行设置: 打开“控制面板”,在搜索框中输入“环境变量”,选择“编辑系统环境变量”。 在“系统属性”窗口中选择…

    other 2023年6月27日
    00
  • tkinter控件详细介绍

    以下是“tkinter控件详细介绍”的完整攻略: tkinter控件详细介绍 Tkinter是Python的标准GUI库,用于创建图形界面。Tkinter提供了许多控件,用于创建各种GUI应用程序。以下是一些常用的Tkinter控件及其用法: Label Label控件用于在GUI中显示文本或图。以下是一个示例: from tkinter import * …

    other 2023年5月7日
    00
  • docker容器设置env

    当然,我很乐意为您提供有关“docker容器设置env”的完整攻略。以下是详细的步骤和两个示例: 1. 什么是Docker容器的env? Docker容器的env是指容器中的环境变量。环境变量是一种在操作系统中存储值的机制,可以在应用程序中使用这些值。在Docker容器中,可以使用环境变量来配置应用程序的行为。 以下是设置Docker容器的env的基本语法:…

    other 2023年5月6日
    00
  • CentOS 7下systemd管理的详解

    CentOS 7下systemd管理的详解 简介 systemd是Linux系统管理和初始化的系统和服务管理器。它是CentOS 7及以上版本的默认init系统。它允许用户管理和配置系统服务,提供更好的管理和日志功能。本文将详细讲解CentOS 7下如何使用systemd进行服务管理。 systemd 的基本管理命令 以下是常用的systemd管理命令: 启…

    other 2023年6月27日
    00
  • vundle简介安装

    Vundle 简介安装 Vundle 是一个 Vim 插件管理器,可以通过它来轻松地安装和升级 Vim 插件。本文将介绍 Vundle 的基本用法。 安装 Vundle 在使用 Vundle 之前,需要先安装 Vundle。可以通过 Git 命令将 Vundle 下载到本地: git clone https://github.com/VundleVim/Vu…

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部