- <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>
js代码
- <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>
css样式
- <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>