描述

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

效果


源码

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. <JZOJ1286>太空电梯

    一道简单可爱的dp #include<cstdio> #include<iostream> #include<cstring> #include<algori ...

  2. ServletContext+ServletConfig内容

    ServletConfig { ① //读取web.xml配置信息 ServletConfig config = this.getServletConfig(); //读取类名称 config.get ...

  3. JavaScript闭包、Object对象

    JavaScript闭包 定义:闭包指一个拥有许多变量和绑定这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. function a(){ var i=0; function ...

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

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

  5. kettle_errot_karafLifecycleListenter

    使用kettle 6.1 通过命令行批量执行作业的过程中,发现偶尔有作业执行时间会变慢几分钟,查看日志发现改作业开始就报了一个错 报错之后才会继续下面的作业,虽然不影响最终作业执行结果,但也延误了一些 ...

  6. 5G-NR物理信道与调制-下行链路v1.1.0

    上接<5G-NR物理信道与调制v1.1.0>下行链路 References Definitions, symbols and abbreviations 帧结构与物理资源 通用函数 上行链 ...

  7. K8S实战-构建Django项目-03-使用共享存储

    上篇博文,发布之后,正好跟着双十一,不知道大家剁手了没~~.好啦,言归正传先声明一下,每周1,3,5更新教程,大家如果想要了解更多的教程可以重温一下之前的教程或者,关注崔格拉斯 公众号,大家想要源码的 ...

  8. QIs for Spread

    玩了好几天,看了好多剧,所以这几天的进度稍微有点慢,另外,<一起同过窗>真香! 延展特性涉及解集覆盖的区域.一个具有良好分布的解集应该包含来自PF每个部分的解集,而不遗漏任何区域.然而,大 ...

  9. Leetcode 703题数据流中的第K大元素(Kth Largest Element in a Stream)Java语言求解

    题目链接 https://leetcode-cn.com/problems/kth-largest-element-in-a-stream/ 题目内容 设计一个找到数据流中第K大元素的类(class) ...

  10. css雪碧图压缩

    cssgaga下载地址 链接: https://pan.baidu.com/s/1Q9xH_XzumIc7vTLCZ3tr5A 提取码: stqe CssGaga功能特性 合并import的CSS文件 ...