<template> <view> <view class="content_wrapper"> <view class="image_wrapper" :key="indexs" v-for="(img, indexs) in showImageData"> <icon v-if="!disabled" @click.stop="deleteImage(indexs)" type="clear" size="18" class="deleteIcon"></icon> <image :style="style" @click="showImage(showImageData,indexs)" class="photo-img" :src="fileHeader+img[valueKey]"></image> </view> <view :style="style" v-if="!disabled " class="photo-img-wrapper" @click="handleselectFile"> <image class="add-img" src="#"></image> <view class="add-desc">上传图片</view> </view> </view> </view> </template>
<script> export default {
//来自父组件的值 props: { fileList:{ type: Array, default: () => [] }, value: { type: Array, default: () => [] }, style: { type: [Object, String], default: '' }, showAdd: { type: Boolean, default: () => true }, valueKey: { type: String, default: 'photo' }, disabled: { type: Boolean, default: false } }, data() { return { fileHeader: this.fileHeader, showImageData: JSON.parse(JSON.stringify(this.fileList)), } }, watch: { fileList: { handler() { this.showImageData = JSON.parse(JSON.stringify(this.fileList)) }, deep: true, immediate: true, } }, methods: { //选择图片 handleselectFile() { uni.hideKeyboard() this.choseImage(); }, choseImage() { // 任务详情上传图片 uni.showActionSheet({ itemList: ['拍照', '相册'], success: res => { let index = res.tapIndex; if (index === 0) { //#ifdef MP-WEIXIN uni.authorize({ scope: 'scope.camera', success: () => { uni.chooseImage({ sourceType: ['camera'], success: res => { let tempFilePaths = res.tempFilePaths; this.uploadFilesTask(tempFilePaths); } }); } }); //#endif //#ifdef APP-PLUS || H5 uni.chooseImage({ sourceType: ['camera'], success: res => { let tempFilePaths = res.tempFilePaths; this.uploadFilesTask(tempFilePaths); } }); //#endif } else { uni.chooseImage({ sourceType: ['album'], success: res => { let tempFilePaths = res.tempFilePaths; this.uploadFilesTask(tempFilePaths); } }); } } }); }, async uploadFilesTask(images) { uni.showLoading({ title: '上传中...' }) for (let i in images) { let uploadData = false; try { // 上传部分 uploadData = await this.uploadImageReq(images[i]) if (uploadData !== false) { if (uploadData.code == this.ERR_CODE) { let obj = {} obj[this.valueKey] = uploadData.body this.showImageData.push(obj)
//子组件传递父组件,属性,值 this.$emit("imageChange", this.showImageData); } else { uni.hideLoading() break uni.showToast({ title: uploadData, icon: 'none' }) } } } catch (err) { console.log(err); return; } } uni.hideLoading(); }, uploadImageReq(file) { return new Promise((resolve, reject) => { uni.uploadFile({ url: '上传图片的服务器地址', filePath: file, name: 'file', formData: { Authorization: token信息 }, success: result => { let res = JSON.parse(result.data) if (res.code == 200) { resolve(res); } else { reject('接口返回错误'); } }, fail: () => { reject('网络链接错误'); } }); }); }, //删除图片 deleteImage(index) { uni.showModal({ title: '提示', content: '确定删除?', success: (res) => { if (res.confirm) { this.showImageData.splice(index, 1); this.$emit('imageChange', this.showImageData) } else if (res.cancel) { console.log('用户点击取消'); } } }); }, // 预览 showImage(list, index) { const imageList = [] list.forEach(item => { imageList.push(item[this.valueKey]) }) uni.previewImage({ urls: imageList, current: index }) }, } } </script>
<style lang="scss" scoped> .content_wrapper { display: flex; flex-wrap: wrap; justify-content: flex-start; align-items: center; .image_wrapper { margin-right: 20rpx; position: relative; .photo-img { // padding: 10upx; width: 150upx; height: 150upx; } .deleteIcon { position: absolute; z-index: 99; overflow: hidden; top: -10rpx; right: -10rpx; } } .photo-img-wrapper { width: 150upx; height: 150upx; background: rgba(0, 0, 0, 0.02); border: 1upx solid rgba(0, 0, 0, 0.15); box-sizing: border-box; border-radius: 5px 5px 5px 5px; display: flex; justify-content: center; align-items: center; flex-wrap: wrap; flex-direction: column; .add-img { width: 68upx; height: 68upx; color: #0081ff; } .add-desc { color: rgba(0, 0, 0, 0.65); font-size: 28upx; font-family: PingFangSC-regular; } } } </style>