/**
|
* CImagePicker
|
* @author Tevin
|
*/
|
|
<template>
|
<view class="c-image-picker">
|
<AtInput
|
ref="input"
|
:name="itemRes.name"
|
:title="itemRes.label"
|
:required="itemRes.required"
|
:error="itemRes.error"
|
/>
|
<AtImagePicker
|
ref="picker"
|
multiple
|
mode="aspectFit"
|
:count="9"
|
:length="3"
|
:files="files"
|
:onChange="(files,operationType,index)=>handleChange(files,operationType,index)"
|
:onFail="evt=>handleFail(evt)"
|
:onImageClick="(index, file)=>handleImgView(index,file)"
|
/>
|
<AtCurtain
|
class="c-image-picker-view"
|
closeBtnPosition="top-right"
|
:isOpened="showImg"
|
:onClose="evt=>handleImgClose()"
|
>
|
<image
|
class="img"
|
mode="aspectFit"
|
:src="curtainImg"
|
/>
|
</AtCurtain>
|
</view>
|
</template>
|
|
<script>
|
import { $ } from '@tarojs/extend';
|
import Taro from '@tarojs/taro';
|
import { AtInput, AtImagePicker, AtCurtain } from 'taro-ui-vue';
|
import { $fetcherCommon } from '@fetchers/FCommon';
|
import './cImagePicker.scss';
|
|
export default {
|
name: 'CImagePicker',
|
components: {
|
AtInput,
|
AtImagePicker,
|
AtCurtain,
|
},
|
props: {
|
// 表单数据资源(表单组件内部机制专用)
|
itemRes: Object,
|
},
|
data() {
|
return {
|
showImg: false,
|
curtainImg: '',
|
};
|
},
|
computed: {
|
files() {
|
const value = this.itemRes.formData[this.itemRes.name];
|
let files = [];
|
if (Object.prototype.toString.call(value) === '[object String]') {
|
files = value.split(',').map(url => ({ url }));
|
} else if (Object.prototype.toString.call(value) === '[object Array]') {
|
files = value.map(url => ({ url }));
|
}
|
files.push({ type: 'btn' });
|
return files;
|
},
|
},
|
methods: {
|
handleChange(files, operationType, index) {
|
const value = [];
|
files.forEach(file => {
|
if (file.type === 'btn') {
|
return;
|
}
|
value.push(file.url);
|
});
|
this.itemRes.onChange(value);
|
},
|
handleImgView(index, file) {
|
this.curtainImg = file.url;
|
this.showImg = true;
|
},
|
handleImgClose() {
|
this.showImg = false;
|
},
|
handleFail(msg) {
|
Taro.showToast({
|
title: msg,
|
icon: 'none',
|
mask: true,
|
duration: 2000,
|
});
|
},
|
$uploadImage(callback) {
|
const url = $fetcherCommon.getUploadImgURL();
|
const uploadTeam = [];
|
const imgs = [];
|
this.files.forEach(file => {
|
if (file.type === 'btn') {
|
return;
|
}
|
// blob 二进制文件才上传
|
if (file.url.indexOf('blob') >= 0) {
|
uploadTeam.push(
|
new Promise((resolve, reject) => {
|
Taro.uploadFile({
|
url,
|
filePath: file.url,
|
name: 'file',
|
formData: {},
|
success(res) {
|
const res2 =
|
typeof res.data === 'string'
|
? JSON.parse(res.data)
|
: res.data;
|
if (res2.state.code === 2000) {
|
resolve(
|
$fetcherCommon.transImgPath(
|
'fix',
|
res2.data.src
|
)
|
);
|
} else {
|
reject({ message: 'res2.state.msg' });
|
}
|
},
|
cancel() {
|
reject({ message: '上传图片已取消!' });
|
},
|
fail() {
|
reject({ message: '上传图片失败!' });
|
},
|
});
|
})
|
);
|
}
|
// 其他类型视为 url,忽略
|
else {
|
uploadTeam.push(Promise.resolve(file.url));
|
}
|
});
|
Promise.all(uploadTeam)
|
.then(res => {
|
this.itemRes.onChange(res);
|
setTimeout(() => {
|
callback('success');
|
}, 0);
|
})
|
.catch(err => {
|
callback('error', err);
|
});
|
},
|
},
|
mounted() {
|
if (process.env.TARO_ENV === 'h5') {
|
$(this.$refs.input.$el)
|
.find('.at-input__input')
|
.prepend(this.$refs.picker.$el);
|
} else if (process.env.TARO_ENV === 'weapp') {
|
$(this.$refs.input.$el)
|
.find('.at-input__container')
|
.append(this.$refs.picker.$el);
|
}
|
},
|
};
|
</script>
|