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日

相关文章

  • Opencv检测多个圆形(霍夫圆检测,轮廓面积筛选)

    Opencv是一种广泛使用的开源计算机视觉和机器学习库,可以实现许多图像处理和计算机视觉任务。其中,霍夫圆检测算法是Opencv中检测圆形的经典算法,常用于检测图像中的圆形物体。本文将详细探讨如何使用霍夫圆检测算法和轮廓面积筛选的方法来检测多个圆形,并提供两个示例说明。 准备工作 在使用Opencv进行圆形检测之前,需要进行以下准备工作: 导入Opencv库…

    other 2023年6月26日
    00
  • intellijidea2018激活

    以下是关于“IntelliJ IDEA 2018激活”的完整攻略,包括基本概念、步骤和两个示例。 基本概念 IntelliJ IDEA是一款由JetBrains开发的Java集成开发环境(IDE),它提供了丰富的功能和工具,帮助开发人员更高地开发Java应用程序。IntelliJ IDEA 2018是IntelliJ IDEA的一个版本,它在2018年发布。…

    other 2023年5月7日
    00
  • paypal提现到派安盈无法绑定firstcenturybank账号怎么办

    如果您在PayPal上提现到派安盈账户时无法绑定First Century Bank账号,可以按照以下攻略进行操作: 确认账户信息 先,您需要确认您的派安盈账户信息是否正确。请检查您的账户名、账户号码、银行名称等信息是否正确。如果信息不正确,您需要联系派安盈客服进行修改。 联系First Century Bank客服 如果您的派安盈账户信息正确但仍然无法绑定…

    other 2023年5月9日
    00
  • 易语言对数据库操作之“取字段尺寸”命令用法

    易语言对数据库操作之“取字段尺寸”命令用法详解 什么是数据库字段尺寸? 在数据库中,每个字段都有其数据类型和长度,长度也叫做尺寸。尺寸是指该字段能够存储的最大字节数或者字符个数,通常以字节或字符数表示。在对数据库进行操作时,我们有时需要获取某个字段的尺寸,以便进行一些相关的操作,比如保证输入数据不超过字段长度限制。 易语言中的“取字段尺寸”命令 在易语言中,…

    other 2023年6月25日
    00
  • ASP.NET中利用Segments取得URL的文件名的一种方法分享

    ASP.NET中利用Segments取得URL的文件名是指可以通过一系列的代码操作,获取当前URL所指向的页面或文件名,然后进行进一步的处理。下面是一个基于代码操作的攻略: 步骤1:获取URL的所有Segments 首先,我们需要获取当前URL的所有Segments,这可以通过内置对象Request的属性Url属性和Segments属性来获取。例如,以下代码…

    other 2023年6月26日
    00
  • CentOS7和CentOS6有什么不同呢?

    CentOS是一款流行的Linux操作系统,其中包括了许多版本。CentOS6和CentOS7在系统架构和功能上有很多不同之处。 CentOS 7和CentOS 6的区别 1. 系统架构 CentOS6采用的是Linux内核版本为2.6.x,而CentOS7采用的是Linux内核版本为3.x。这意味着CentOS7在安全性、性能等方面都更加优化。 2. 命令…

    other 2023年6月27日
    00
  • 苹果电脑的Mac系统安装应用程序(软件)的方法(图文教程)

    苹果电脑的Mac系统安装应用程序(软件)的方法(图文教程) 1. 从App Store下载安装 步骤如下: 打开App Store 在搜索框中输入软件名称或关键字 找到相应的软件,然后点击“获取”或“安装”按钮 输入Apple ID和密码进行确认 下载完成后,在“启动台”中找到并打开软件 示例说明1:下载并安装“Pages” 打开App Store 在搜索框…

    other 2023年6月25日
    00
  • 未定事件簿卡牌培养建议与优先级说明 卡牌培养攻略

    未定事件簿卡牌培养建议与优先级说明 卡牌培养攻略 目录 引言 卡牌培养建议 卡牌培养优先级说明 示例说明 示例1: 基础卡牌培养 示例2: 稀有度提升 1. 引言 在未定事件簿这款卡牌游戏中,卡牌培养是提升战斗力和战胜对手的关键。本攻略将详细介绍卡牌培养的建议和优先级,帮助玩家合理利用资源和策略。 2. 卡牌培养建议 在进行卡牌培养时,以下几个方面需要考虑:…

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