描述

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

效果


源码

pictures-wall.wxml

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

pictures-wall.js

  1. Component({
  2. properties: {
  3. mydata: Array,
  4. mymaxcount: Number,
  5. },
  6. data: {
  7. value: [], // 暂存上传结果
  8. canUseCount: 0, // 可使用个数
  9. },
  10. observers: {
  11. 'mydata, mymaxcount': function (mydata, mymaxcount) {
  12. this.setData({ canUseCount: (mymaxcount || 3) - mydata.length });
  13. },
  14. },
  15. methods: {
  16. handleUpload: function () {
  17. const { canUseCount } = this.data;
  18. wx.chooseImage({
  19. count: canUseCount,
  20. success: (res) => {
  21. wx.showLoading();
  22. Promise.all(res.tempFilePaths.map(d => this.uploadFile(d)))
  23. .finally(() => { // app.js中实现promise finally
  24. wx.hideLoading();
  25. this.triggerEvent('mychange', [...this.data.mydata, ...this.data.value]);
  26. this.data.value = []; // 清空上传结果
  27. })
  28. }
  29. })
  30. },
  31. uploadFile: function (filePath) {
  32. return new Promise((resolve, reject) => {
  33. wx.uploadFile({
  34. url: '--url--',
  35. filePath,
  36. name: 'file',
  37. success: (res) => {
  38. if (res.statusCode === 200) {
  39. let json = JSON.parse(res.data);
  40. this.data.value.push({
  41. filePath,
  42. // 业务数据
  43. });
  44. resolve();
  45. return;
  46. }
  47. reject();
  48. },
  49. fail: (err) => {
  50. reject(err);
  51. }
  52. })
  53. })
  54. },
  55. handleImageDelete: function ({ currentTarget: { dataset: { index } } }) {
  56. const { mydata } = this.data;
  57. mydata.splice(index, 1);
  58. this.triggerEvent('mychange', mydata);
  59. },
  60. }
  61. })

pictures-wall.wxss

  1. .picBox {
  2. position: relative;
  3. display: inline-block;
  4. vertical-align: top;
  5. width: 208rpx;
  6. height: 208rpx;
  7. margin-right: 26rpx;
  8. margin-bottom: 26rpx;
  9. border-radius: 4rpx;
  10. border: 1px solid rgba(204,204,204,1);
  11. }
  12. .pic {
  13. width: 100%;
  14. height: 100%;
  15. }
  16. .picDelete {
  17. position: absolute;
  18. left: -32rpx;
  19. top: -32rpx;
  20. height: 64rpx;
  21. width: 64rpx;
  22. line-height: 64rpx;
  23. text-align: center;
  24. }
  25. .picturesWall .picBox:nth-child(3n) {
  26. margin-right: 0;
  27. }
  28. .addicon {
  29. position: absolute;
  30. display: inline-block;
  31. left: 104rpx;
  32. top: 54rpx;
  33. height: 100rpx;
  34. width: 0rpx;
  35. border-right: 1px solid #CCCCCC;
  36. }
  37. .addicon::after {
  38. content: '';
  39. position: absolute;
  40. top: 50rpx;
  41. left: -50rpx;
  42. display: block;
  43. height: 0rpx;
  44. width: 100rpx;
  45. border-bottom: 1px solid #CCCCCC;
  46. }

pictures-wall.json

  1. {
  2. "component": true,
  3. "usingComponents": {}
  4. }

app.js

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

  1. App({
  2. onLaunch: function () {
  3. // finally
  4. Promise.prototype.finally = function (callback) {
  5. let P = this.constructor;
  6. return this.then(
  7. value => P.resolve(callback()).then(() => value),
  8. reason => P.resolve(callback()).then(() => { throw reason })
  9. );
  10. };
  11. },
  12. globalData: {
  13. }
  14. })

使用例子

test.wxml

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

test.js

  1. Page({
  2. data: {
  3. picList: [],
  4. 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'}],
  5. },
  6. handlePicturesChange: function ({ detail }) {
  7. this.setData({ picList: detail })
  8. },
  9. handlePicturesChange1: function ({ detail }) {
  10. this.setData({ picList1: detail })
  11. },})

test.json

  1. {
  2. "navigationBarTitleText": "demo",
  3. "usingComponents": {
  4. "pictures-wall": "/components/pictures-wall/pictures-wall"
  5. }
  6. }

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

  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. RROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2

    RROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2 ...

  2. Selenium自动化测试实例-基于python

    一.Selenium介绍 Selenium是一个Web开源自动化测试框架,具有页面级操作.模拟用户真实操作.API从系统层面触发事件等特点. 1.版本 Selenium 1.0  Sever/Clie ...

  3. spring-boot-学习笔记(三)-过滤器

      过滤器有两种配置方式,一种是通过注解来完成,一种是通过自定义配置类来设置 这里假设的场景是,定义一个过滤器,过滤所有请求,如果参数中没有username信息则重定向到login_page登录页面, ...

  4. LeetCode 刷题记录(1-5题)

    1 两数之和(题目链接) class Solution: # 一次哈希法 def twoSum(self, nums, target): """ :type nums: ...

  5. ProjectSend R561 SQL INJ Analysis

    注入出现在./client-edit.php中 ...... if (isset($_GET['id'])) { $client_id = mysql_real_escape_string($_GET ...

  6. 用PHP实现的快速排序算法(支持记录原始数组下标)

    代码如下 <?php /** * 快速排序 */ define("MAX_LENGTH_INSERT_SORT", 7); class QuickSort { /** * 交 ...

  7. 爬虫(二)requests 登陆某检索网站

    1 import requests import os from PIL import Image import pytesseract import re rootUrl = xxx # 构建登录页 ...

  8. 【算法记事本#NLP-1】最大匹配算法分词

    本文地址:https://www.cnblogs.com/oberon-zjt0806/p/12409536.html #NLP-1 最大匹配算法(MM) 最大匹配算法(Maximum Matchin ...

  9. Dubbo源码解析之SPI(一):扩展类的加载过程

    Dubbo是一款开源的.高性能且轻量级的Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用.智能容错和负载均衡,以及服务自动注册和发现. Dubbo最早是阿里公司内部的RPC框架,于 ...

  10. JS基础入门篇(十八)—日期对象

    1.日期对象 日期对象: 通过new Date()就能创建一个日期对象,这个对象中有当前系统时间的所有详细信息. 以下代码可以获取当前时间: <script> var t = new Da ...