微信小程序实现 带单选框 图片上传、预览、删除功能

参考官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/network/upload/wx.uploadFile.html

功能图:

功能图:在这里插入图片描述

.wxml:

 <!-- 上传图片功能 -->

<view class="uploader">
  <view class="uploader-text">相册</view>
  <view class="uploade-box">
    <!-- 上传成功的图片+单选框+删除按钮显示 -->
    <view class="uploader-showItem" wx:for="{{imagesList}}" wx:key="id">
      <!-- 图片 -->
      <view class="showItem-image" data-current="{{item.imagesObj.filePath}}" bindtap="previewImages">
        <image style="width:100%;height:100%" src="{{item.imagesObj.filePath}}"></image>
      </view>
      <!-- 删除按钮 -->
      <view class="showItem-icon-box" data-index="{{index}}" bindtap="deleteImages">
        <icon class="showItem-icon" type="clear" size="20" color="red"></icon>
      </view>
      <!-- 单选框 -->
      <radio-group class="radio-group" data-index="{{index}}" bindchange="handleRadio">
        <label class="checkbox">
            <radio checked="{{item.imagesObj.main_image}}"/><text>是否显示为主图</text>
          </label>
      </radio-group>
    </view>
    <!-- 上传按钮+框 -->
    <view class="uploader-btn" bindtap="uploaderImages">
      <view class="uploader-btn-icon"></view>
    </view>
  </view>
</view> 

.wxss:

 /* 上传图片功能  */
.uploader{
  width: 100%;
  display: flex;
  margin-top: 30rpx;
}
.uploader-text{ 
  margin-left:20rpx;
  min-width: 64rpx
}
.uploader-showItem{
  position: relative;
  margin-bottom: 20rpx;
}
.uploade-box{
  display: flex;
  flex-wrap:wrap;
  flex: 1;
}
 .showItem-image{
  width: 200rpx;
  height: 200rpx;
  border: 2rpx solid #d9d9d9;
  margin-left: 20rpx;
}
.showItem-icon-box{
  position: absolute;
  top: -1px;
  right: 1px;
  width: 28rpx;
  height: 28rpx;
  border-radius: 50rpx;
  background: #fff;
}
.showItem-icon{
  position: absolute;
  top: -4px;
  right: -4px;
}
.uploader .uploader-btn{
    width: 200rpx;
    height: 200rpx;
    border: 2rpx solid #d9d9d9;
    position: relative;
    margin-left: 20rpx;
}
.uploader-btn-icon:before {
  content: " ";
  position: absolute;
  width: 4rpx;
  height: 79rpx;
  top: 50%;
  left: 50%;
  /* -webkit-transform: translate(-50%, -50%);*/ 
  transform: translate(-50%, -50%); 
  background-color: #d9d9d9;
}
.uploader-btn-icon:after {
  content: " ";
  position: absolute;
  height: 4rpx;
  width: 79rpx;
  top: 50%;
  left: 50%;
  /* -webkit-transform: translate(-50%, -50%);*/
  transform: translate(-50%, -50%); 
  background-color: #d9d9d9;
}
.checkbox{
  font-size: 20rpx;
}
radio{
  transform:scale(0.7);
}

.js:

//获取应用实例
const app = getApp()
 
Page({
  data: {
    imagesList:[],
  },
 
  onLoad: function() {
  },


  //单选框(遍历imagesList,如果有一个main_image为true,所有都置为false)
  handleRadio(e){
    let index = e.currentTarget.dataset.index
    this.data.imagesList.map((v,i)=>{
      if(index==i){
        v.imagesObj.main_image = true
      }else{
        v.imagesObj.main_image = false
      }
    })
    this.setData({  //map()不改变原数组,所以得再赋一次值
      imagesList:this.data.imagesList
    })
  },
  //图片预览
  previewImages(e){
    let current = e.currentTarget.dataset.current
    let urls = []
    this.data.imagesList.map(v=>{
      urls.push(v.imagesObj.filePath)
    })
    wx.previewImage({
      current, // 当前显示图片的http链接
      urls// 需要预览的图片http链接列表
    })
  },
  //删除图片
  deleteImages(e){
    let index = e.currentTarget.dataset.index
    this.data.imagesList.splice(index,1)
    this.setData({ 
      imagesList:this.data.imagesList
    })
  }, 
  //上传图片
  uploaderImages(){
    var that = this
    wx.chooseImage({
      count: 1,
      sizeType: ['original', 'compressed'], //所选的图片的尺寸(默认:'原图','压缩图')
      sourceType: ['album', 'camera'],  //选择图片的来源(默认:'从相册选图','使用相机')
      success (res) {
        const tempFilePaths = res.tempFilePaths
        wx.uploadFile({
          url: 'http://malltest.daxinbuye.com:9000/api/rivalGoods/file/upload.do', //这是博主的后端接口,可以测试,勾选不校验合法域名...  就行
          filePath: tempFilePaths[0],
          name: 'file',
          // formData: { //可携带参数
          //   'user': 'test'
          // },
          success (res){
            /* 返回的是json格式,使用 JSON.parse()转为我们要的对象,上传的成功后提取所需字段封装成新数组imagesList */ 
            let imagesObj = {
              filePath:tempFilePaths[0],
              id:JSON.parse(res.data).data.id,
              main_image:false,
            } 
            that.data.imagesList.push({imagesObj})
            that.setData({
              imagesList:that.data.imagesList
            })
          }
        })
      }
    })
  }
 
  
})
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值