描述

批量上传图片, 可设置最大上传个数, 可删除, 可设置默认值。

效果


源码

pictures-wall.wxml

<view class="picturesWall">
<view class="picBox" wx:for="{{mydata}}" wx:key="{{index}}">
<image class="pic" src="{{item.filePath || item.url}}" /> <view class="picDelete" data-index="{{index}}" bindtap="handleImageDelete">x</view>
</view>
<view class="picBox" wx:if="{{canUseCount > 0}}" bindtap="handleUpload">
<view class="addicon"></view>
</view>
</view>

pictures-wall.js

Component({
properties: {
mydata: Array,
mymaxcount: Number,
}, data: {
value: [], // 暂存上传结果
canUseCount: 0, // 可使用个数
}, observers: {
'mydata, mymaxcount': function (mydata, mymaxcount) {
this.setData({ canUseCount: (mymaxcount || 3) - mydata.length });
},
}, methods: {
handleUpload: function () {
const { canUseCount } = this.data;
wx.chooseImage({
count: canUseCount,
success: (res) => {
wx.showLoading();
Promise.all(res.tempFilePaths.map(d => this.uploadFile(d)))
.finally(() => { // app.js中实现promise finally
wx.hideLoading();
this.triggerEvent('mychange', [...this.data.mydata, ...this.data.value]);
this.data.value = []; // 清空上传结果
})
}
})
}, uploadFile: function (filePath) {
return new Promise((resolve, reject) => {
wx.uploadFile({
url: '--url--',
filePath,
name: 'file',
success: (res) => {
if (res.statusCode === 200) {
let json = JSON.parse(res.data);
this.data.value.push({
filePath,
// 业务数据
});
resolve();
return;
}
reject();
},
fail: (err) => {
reject(err);
}
})
}) }, handleImageDelete: function ({ currentTarget: { dataset: { index } } }) {
const { mydata } = this.data;
mydata.splice(index, 1);
this.triggerEvent('mychange', mydata);
}, } })

pictures-wall.wxss

.picBox {
position: relative;
display: inline-block;
vertical-align: top;
width: 208rpx;
height: 208rpx;
margin-right: 26rpx;
margin-bottom: 26rpx;
border-radius: 4rpx;
border: 1px solid rgba(204,204,204,1);
} .pic {
width: 100%;
height: 100%;
} .picDelete {
position: absolute;
left: -32rpx;
top: -32rpx;
height: 64rpx;
width: 64rpx;
line-height: 64rpx;
text-align: center;
} .picturesWall .picBox:nth-child(3n) {
margin-right: 0;
} .addicon {
position: absolute;
display: inline-block;
left: 104rpx;
top: 54rpx;
height: 100rpx;
width: 0rpx;
border-right: 1px solid #CCCCCC;
}
.addicon::after {
content: '';
position: absolute;
top: 50rpx;
left: -50rpx;
display: block;
height: 0rpx;
width: 100rpx;
border-bottom: 1px solid #CCCCCC;
}

pictures-wall.json

{
"component": true,
"usingComponents": {}
}

app.js

由于微信小程序Promise finally, 所以要在app.js里实现一下。

App({
onLaunch: function () {
// finally
Promise.prototype.finally = function (callback) {
let P = this.constructor;
return this.then(
value => P.resolve(callback()).then(() => value),
reason => P.resolve(callback()).then(() => { throw reason })
);
};
}, globalData: { }
})

使用例子

test.wxml

<pictures-wall mydata="{{picList}}" mymaxcount="{{9}}" bindmychange="handlePicturesChange" />
<pictures-wall mydata="{{picList1}}" mymaxcount="{{9}}" bindmychange="handlePicturesChange1" />

test.js

Page({
data: {
picList: [],
picList1: [{url: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1567767650570&di=e99314caaadc830e9b590311945cdbaa&imgtype=0&src=http%3A%2F%2Fimages.liqucn.com%2Fh027%2Fh13%2Fimages201508311321540_info200X200.png'}],
}, handlePicturesChange: function ({ detail }) {
this.setData({ picList: detail })
},
handlePicturesChange1: function ({ detail }) {
this.setData({ picList1: detail })
},})

test.json

{
"navigationBarTitleText": "demo",
"usingComponents": {
"pictures-wall": "/components/pictures-wall/pictures-wall"
}
}

[组件封装]微信小程序-图片批量上传照片墙的更多相关文章

  1. 微信小程序多张图片上传

    微信小程序上传图片每次只能上传一张,所有很多朋友就会问想要多张图片上传怎么办? 首先,我们来看一看wx.chooseImage(object)和wx.uploadFile(OBJECT)这两个个api ...

  2. 微信小程序 多图上传解决方案

    为了使代码体积小  我这里将多图上传 封装到单独的一个js 页面的js调用他 我们看firhealth.js文件内容 // pages/home/home.js var upload = requir ...

  3. 微信小程序多图上传/朋友圈传图效果【附完整源码】

    效果图 部分源代码 js文件: var uploadPicture = require('../Frameworks/common.js') //获取应用实例 const app = getApp() ...

  4. 微信小程序wx.uploadFile 上传文件 的两个坑

    fileUpload: function (tempFilePath) { var that = this;//坑1: this需要这么处理 wx.uploadFile({ url: url地址, / ...

  5. 微信小程序 --- 文件的上传和下载

    文件上传 / 文件下载 : wx.uploadFile

  6. [组件封装]微信小程序-日历

    描述 切换月份, 当天文案为今天, 日期背景变色, 日期红点标识, 点击选中日期. 效果 源码 calendar.wxml <view class="component"&g ...

  7. [组件封装]微信小程序-底部弹框

    描述 模仿ios浏览器底部弹框效果. 遮罩层淡入淡出,弹框高度根据内容自适应. 效果 源码 popup-bottom.wxml <!-- popup-bottom.wxml --> < ...

  8. 微信小程序文件压缩上传

    试用场景:上传图片过大,需进行压缩处理. 涉及微信API API 说明 文档 chooseImage 选择图片 https://developers.weixin.qq.com/miniprogram ...

  9. 微信小程序开发,上传wx.uploadFile 返回参数处理

    这真的是个坑,前端看了半天,说是字符串,让后台处理,后台说返回的是正确的,原来这个请求就是返回的string类型,见下图,无法取到code,需要前台自己转化. 以下为百度出来的参考: wx.reque ...

随机推荐

  1. js 实现排序算法 -- 快速排序(Quick Sort)

    原文: 十大经典排序算法(动图演示) 快速排序 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整 ...

  2. Navicat远程连接服务器Mysql

    使用NAVICAT远程访问MYSQL的步骤 1.修改远程访问权限 //进入MySQL服务器或使用其它工具 xxxx@ubuntu:/$ mysql -h localhost -u root -p xx ...

  3. python标准库-calendar 模块

    原文地址:http://www.bugingcode.com/blog/python_calendar.html calendar 模块是python实现的unix 的 cal命令.它可以以标准的模式 ...

  4. Luogu_1966_火柴排队

    题目描述 涵涵有两盒火柴,每盒装有\(n\)根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:$ \sum (a_i-b_i)^2 ...

  5. CentOS使用epel安装不同版本php-fpm

    针对CentOS使用epel安装 yum -y install epel-release安装好后可以通过如下命令查看yum info epel-releaseyum repolist查看php版本ph ...

  6. Magic Methods 5

    描述符 : 将某种特殊类型的类的实例指派给另一个类的属性. 特殊类型为以下方法的1-3个 : __get__(self, instance, owner):用于访问属性,它返回属性的值 __set__ ...

  7. 关于运算符的那些坑—自增x++&&++y

    题目 比较常见的问题,因为比较细,看书的时候一不注意可能就过去啦,但是遇到的时候就会容易出问题.先看下面程序,考虑一下运行结果是什么呢? int x = 1, y = 1; if(x++ == 2 & ...

  8. Seeing AI:计算机视觉十年磨一剑,打造盲人的“瑞士军刀”

    Mary Bellard(左)和AnneTaylor(右)是Seeing AI开发团队的成员,SeeingAI成果的背后是计算机视觉数十年研究的支持. 当Anne Taylor走进一个房间时,她像其 ...

  9. Windows系统在Python2.7环境下安装numpy, matplotlib, scipy - Lichanghao Blog

    numpy, matplotlib, scipy三个包是科学计算和绘图的利器.安装它们既可以在网上下载exe安装包,也可以用python内置的包管理工具来下载安装,后者较为方便. 这几天做美赛要用到, ...

  10. 下载cv2时下载失败或下载成功却无法使用怎么办

    最近我也在安装cv2的时候遇到了奇怪的问题,导致在安装cv2的时候无法使用.我在网上查了各种资料,虽然都对的,但都不太全面.本文就把安装cv2时可能遇到的各种奇怪的问题的解决方案做一个总结,供大家参考 ...