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日

相关文章

  • MySQL数据库输入密码后闪退问题的解决方法

    下面就是详细讲解MySQL数据库输入密码后闪退的解决方法完整攻略: 问题背景 MySQL是一种开源数据库,常用于Web应用程序的后台支持。在使用MySQL时,经常会遇到以下问题:输入密码后闪退。 解决方法 MySQL输入密码后闪退问题通常是由于MySQL配置文件中的一些错误或问题导致的。可以通过以下步骤解决这个问题: 步骤1:检查MySQL配置文件 首先,打…

    other 2023年6月26日
    00
  • android多开器解析与检测实现方法示例

    Android多开器解析与检测实现方法示例攻略 简介 Android多开器是一种工具,允许用户在同一台设备上同时运行多个相同或不同的Android应用程序实例。本攻略将详细介绍Android多开器的解析与检测实现方法,并提供两个示例说明。 解析Android多开器 Android多开器的解析方法可以通过以下步骤实现: 检测设备是否已经root:Android…

    other 2023年9月7日
    00
  • Windows系统/office安装与激活

    Windows系统/Office安装与激活 作为电脑使用者,我们经常需要安装和使用各种软件,其中最常见的非Windows系统和Office套件莫属了。然而,很多人在安装和激活软件时会遇到各种问题,本文旨在为大家提供一些基础知识和方法,方便大家快速完成安装和激活流程。 Windows系统的安装 首先,我们需要准备好Windows系统的安装文件和安装工具,这些可…

    其他 2023年3月28日
    00
  • ES6正则表达式的一些新功能总结

    ES6正则表达式的一些新功能总结 ES6为正则表达式新增了很多功能,包括修饰符、断言、Unicode支持等等。下面详细介绍一下ES6正则表达式的新功能。 修饰符 ES6新增了两个修饰符:u 和 y。 u 修饰符 u 修饰符用于处理 Unicode 字符,可以正确处理四个字节的 UTF-16 编码。 示例: /^\uD83D/u.test(‘\uD83D\uD…

    other 2023年6月27日
    00
  • Java构造器与传值学习总结

    Java构造器与传值学习总结 在Java中,构造器是一种特殊的方法,用于创建和初始化对象。构造器的名称必须与类名相同,并且没有返回类型。在本文中,我们将详细讲解Java构造器的概念以及如何使用它们来传递值。 构造器的基本概念 构造器在创建对象时被调用,用于初始化对象的成员变量。它们可以接受参数,并将这些参数的值赋给对象的成员变量。构造器可以有多个重载版本,每…

    other 2023年8月6日
    00
  • android布局——单复选框(今天上课的内容总结下)

    Android布局——单复选框 单复选框是Android布局中经常使用的UI组件,它们可以让用户选择或确定某些选项,进而影响App的行为。在本篇文章中,我们将详细介绍单复选框的使用方法及布局技巧。 单选框 单选框(RadioButton)是一组互斥的选项,用户只能选择其中的一项。单选框通过RadioGroup容器进行布局,RadioGroup容器内的Radi…

    其他 2023年3月28日
    00
  • Spring Boot访问静态资源css/js,你真的懂了吗

    下面是完整攻略: Spring Boot访问静态资源 什么是静态资源 静态资源(Static Resources),通常指不需要动态生成的文件,比如HTML、CSS、JS、图片等。静态资源一般存放在Web应用的WebRoot目录下。 Spring Boot静态资源访问配置 Spring Boot使用默认的静态资源路径,如下: classpath:/META-…

    other 2023年6月27日
    00
  • Swift初始化器与可选链的使用方法介绍

    Swift初始化器与可选链的使用方法介绍 初始化器 初始化器是用来初始化一个类、结构体或枚举的方法。在Swift中,一个对象被创建时就需要调用其初始化器,以确保其具有正确的初始状态。 Swift提供了很多初始化器来让我们在创建对象的时候,提供对应的属性值。常见的初始化器包括: 默认初始化器 默认初始化器是指当我们没有提供类的自定义初始化器时,默认提供的一个初…

    other 2023年6月20日
    00
合作推广
合作推广
分享本页
返回顶部