基于vue-upload-component封装一个图片上传组件的示例

2020-06-16 06:26:05易采站长站整理

需求分析

业务要求,需要一个图片上传控件,需满足

多图上传
点击预览
图片前端压缩
支持初始化数据

相关功能及资源分析

基本功能

先到

https://www.npmjs.com/search?q=vue+upload
上搜索有关上传的控件,没有完全满足需求的组件,过滤后找到
vue-upload-component
组件,功能基本都有,自定义也比较灵活,就以以此进行二次开发。

预览

因为项目是基于

vant
做的,本身就提供了
ImagePreview
的预览组件,使用起来也简单,如果业务需求需要放大缩小,这个组件就不满足了。

压缩
可以通过

canvas
相关api来实现压缩功能,还可以用一些第三方库来实现, 例如
image-compressor.js

数据

因为表单页面涉及编辑的情况,上传组件为了展示优雅点,需要做点处理。首先就先要对数据格式和服务端进行约定,然后在处理剩下的

开发

需求和实现思路基本确定,开始进入编码,先搭建可运行可测试的环境

第一步,创建相关目录


|- components
|- ImageUpload
|- ImageUpload.vue
|- index.js

第二步,安装依赖


$ npm i image-compressor.js -S
$ npm i vue-upload-component -S

第三步,编写核心主体代码


// index.js
import ImageUpload from './ImageUpload'
export default ImageUpload


// ImageUpload.vue
<template>
<div class="m-image-upload">
<!--
这里分为两段遍历,理由是:在编辑情况下要默认为组件添加默认数据,虽然说组件提供了 `add` 方法,
但在编辑状态下,需要把 url 形式的图片转换成 File 之后才可以添加进去,略微麻烦。
所以分两次遍历,一次遍历表单对象里的图片(直接用img标签展示,新上传的图片可以通过 blob 来赋值 src),第二次遍历组件里的 files
-->
<div
class="file-item"
v-for="(file, index) in value">
<img
:src="file.thumb%20||%20file.url"
@click="preview(index)"
/>
<van-icon
name="clear"
class="close"
@click="remove(index, true)"/> <!-- 把图片从数组中删除 -->
</div>
<div
:class="{'file-item': true, 'active': file.active, 'error': !!file.error}"
v-for="(file, index) in files"> <!-- 加几个样式来控制 `上传中` 和 `上传失败` 的样式-->