<template> <!--商品关联系统表单--> <view v-if="value.length>0" class="wrapper virtual_form bg-f boder-24 px-30"> <view class='item acea-row row-between-wrapper' :class="{on:(item.name=='radios' || item.name=='checkboxs'),on2:item.name == 'dateranges',on3:item.name == 'citys',pd0:item.name == 'uploadPicture'}" v-for="(item,index) in orderNewForm" :key="index"> <view class="name"> <text class="item-require" v-if="item.titleShow.val">*</text> {{ item.titleConfig.val }} </view> <!-- radio --> <view v-if="item.name=='radios'" class="discount"> <radio-group @change="radioChange($event, index, item)" class="acea-row row-middle row-right"> <label class="radio" v-for="(j,jindex) in item.wordsConfig.list" :key="jindex"> <view class="acea-row row-middle"> <!-- #ifndef MP --> <radio :value="jindex.toString()" :checked='j.show' /> <!-- #endif --> <!-- #ifdef MP --> <radio :value="jindex" :checked='j.show' /> <!-- #endif --> <view>{{j.val}}</view> </view> </label> </radio-group> </view> <!-- checkbox --> <view v-if="item.name=='checkboxs'" class="discount acea-row"> <checkbox-group @change="checkboxChange($event, index, item)" class="acea-row row-middle row-right"> <label class="radio" v-for="(j,jindex) in item.wordsConfig.list" :key="jindex"> <view class="acea-row row-middle"> <!-- #ifndef MP --> <checkbox :value="jindex.toString()" :checked="j.show" style="transform:scale(0.9)" /> <!-- #endif --> <!-- #ifdef MP --> <checkbox :value="jindex" :checked="j.show" style="transform:scale(0.9)" /> <!-- #endif --> <view>{{j.val}}</view> </view> </label> </checkbox-group> </view> <!-- text --> <view v-if="item.name=='texts' && item.valConfig.tabVal == 0" class="discount"> <input type="text" :placeholder="item.tipConfig.val" class="text-28rpx" placeholder-class="placeholder" v-model="item.value" /> </view> <!-- number --> <view v-if="item.name=='texts' && item.valConfig.tabVal == 4" class="discount"> <input type="number" :placeholder="item.tipConfig.val" class="text-28rpx" placeholder-class="placeholder" v-model="item.value" /> </view> <!-- email --> <view v-if="item.name=='texts' && item.valConfig.tabVal == 3" class="discount"> <input type="text" :placeholder="item.tipConfig.val" class="text-28rpx" placeholder-class="placeholder" v-model="item.value" /> </view> <!-- data --> <view v-if="item.name=='dates'" class="discount"> <picker mode="date" :value="item.value" @change="bindDateChange($event,index)"> <view class="acea-row row-between-wrapper text-28rpx"> <view v-if="item.value == ''" class="text--w111-ccc">{{item.tipConfig.val}}</view> <view v-else>{{item.value}}</view> <text class='iconfont icon-xiangxia'></text> </view> </picker> </view> <!-- dateranges --> <view v-if="item.name=='dateranges'" class="discount"> <uni-datetime-picker v-model="item.value" type="daterange" class="text-28rpx flex" @maskClick="maskClick"> <view v-if="item.value == ''" class="text--w111-ccc">请选择</view> <view v-else>{{item.value.length?item.value[0]+' - '+item.value[1]:item.tipConfig.val}}</view> <text class='iconfont icon-xiangxia'></text> </uni-datetime-picker> </view> <!-- time --> <view v-if="item.name=='times'" class="discount"> <picker mode="time" :value="item.value" @change="bindTimeChange($event,index)" :placeholder="item.tipConfig.value"> <view class="acea-row row-between-wrapper text-28rpx"> <view v-if="item.value == ''" class="text--w111-ccc">{{item.tipConfig.val}}</view> <view v-else>{{item.value}}</view> <text class='iconfont icon-xiangxia'></text> </view> </picker> </view> <!-- timeranges --> <view v-if="item.name=='timeranges'" class="discount acea-row row-between-wrapper" @click="getTimeranges(index)"> <view v-if="item.value" class="text-28rpx">{{item.value}}</view> <view v-else class="text--w111-ccc text-28rpx">{{item.tipConfig.val}}</view> <text class='iconfont icon-xiangxia'></text> </view> <!-- select --> <view v-if="item.name=='selects'" class="discount"> <picker :value="item.value" :range="item.wordsConfig.list" @change="bindSelectChange($event,index,item)" range-key="val"> <view class="acea-row row-between-wrapper"> <view v-if="item.value" class="text-28rpx">{{item.value}}</view> <view v-else class="text--w111-ccc text-28rpx">请选择</view> <text class='iconfont icon-xiangxia'></text> </view> </picker> </view> <!-- city --> <view v-if="item.name=='citys'" class="discount" @click="changeRegion(index)"> <view class="acea-row row-middle row-right"> <view class="city text--w111-ccc" v-if="item.value == ''">{{item.tipConfig.val}}</view> <view class="city text-28rpx" v-else>{{item.value}}</view> <text class='iconfont icon-xiangxia'></text> </view> </view> <!-- id --> <view v-if="item.name=='texts' && item.valConfig.tabVal == 2" class="discount"> <input type="idcard" :placeholder="item.tipConfig.val" class="text-28rpx" placeholder-class="placeholder" v-model="item.value" /> </view> <!-- phone --> <view v-if="item.name=='texts' && item.valConfig.tabVal == 1" class="discount"> <input type="number" :placeholder="item.tipConfig.val" class="text-28rpx" placeholder-class="placeholder" v-model="item.value" /> </view> <!-- img --> <view v-if="item.name=='uploadPicture'" class="confirmImg" style="padding-bottom: 0;"> <view class='upload acea-row row-middle justify-end'> <view class='pictrue' v-for="(items,indexs) in item.value" :key="indexs"> <image :src='items' mode="aspectFill"></image> <view class="close acea-row row-center-wrapper" @tap='DelPic(index,indexs)'> <view class="iconfont icon-guanbi1"></view> </view> </view> <view class='pictrue acea-row row-center-wrapper row-column' @tap='uploadpic(item)' style="margin-right: 0" v-if="item.value.length < item.numConfig.val"> <view>上传图片</view> </view> </view> </view> </view> <!-- 时间选择 --> <timerangesFrom :isShow='isShow' :time='timeranges' @confrim="confrim" @cancel="cancels"></timerangesFrom> <areaWindow ref="areaWindow" :display="display" :address='addressInfoArea' :cityShow='cityShow' @submit="OnChangeAddress" @changeClose="changeAddressClose"></areaWindow> </view> </template> <script> import areaWindow from '../areaWindow'; import timerangesFrom from '../timeranges'; import uniDatetimePicker from '../uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue'; import dayjs from "@/plugin/dayjs/dayjs.min.js"; const CACHE_CITY = {}; export default { props: { value: { type: Array, default: function() { return [] } }, }, components: { areaWindow, timerangesFrom, uniDatetimePicker }, data() { return { orderNewForm: [], isShow: false, timerangesIndex: 0, display: false, addressInfoArea: [], cityShow: 2, timeranges: [], } }, watch: { orderNewForm: { handler(newVal) { this.$emit('input', newVal); }, deep: true, }, }, mounted() { this.getFromData() }, methods: { getFromData() { let formData = [...this.value]; formData.forEach((item, index, arr) => { this.$set(item, 'value', ""); CACHE_CITY[index] = ''; //清空省市区 if (item.name == 'texts') { if (item.defaultValConfig.val) { item.value = item.defaultValConfig.val } else { item.value = '' } } else if (item.name == 'radios') { item.value = item.wordsConfig.list[0].val } else if (item.name == 'uploadPicture') { item.value = []; } else if (item.name == 'dateranges') { if (item.valConfig.tabVal == 0) { if (item.valConfig.tabData == 0) { let obj = dayjs(new Date(Number(new Date().getTime()))).format('YYYY-MM-DD'); item.value = [obj, obj] } else { let data1 = dayjs(new Date(Number(new Date(item.valConfig.specifyDate[0]) .getTime()))).format('YYYY-MM-DD'); let data2 = dayjs(new Date(Number(new Date(item.valConfig.specifyDate[1]) .getTime()))).format('YYYY-MM-DD'); item.value = [data1, data2]; } } else { item.value = []; } } else { if (['times', 'dates', 'timeranges'].indexOf(item.name) != -1) { if (item.valConfig.tabVal == 0) { //显示默认值 if (item.valConfig.tabData == 0) { if (item.name == 'times') { item.value = dayjs(new Date(Number(new Date().getTime()))).format('HH:mm'); } else if (item.name == 'dates') { item.value = dayjs(new Date(Number(new Date().getTime()))).format( 'YYYY-MM-DD'); } else { let current = dayjs(new Date(Number(new Date().getTime()))).format( 'HH:mm'); item.value = current + ' - ' + current; } } else { if (item.name == 'times' || item.name == 'dates') { item.value = item.valConfig.specifyDate; } else { item.value = item.valConfig.specifyDate[0] + ' - ' + item.valConfig .specifyDate[1]; } } } else { item.value = ''; } } else { item.value = ''; } } }) function sortNumber(a, b) { return a.timestamp - b.timestamp; } formData.sort(sortNumber); this.$set(this, 'orderNewForm', formData); }, // 单选 radioChange(e, index, item) { this.orderNewForm[index].value = item.wordsConfig.list[e.detail.value].val }, // 多选 checkboxChange(e, index, item) { let obj = e.detail.value; let val = ''; item.wordsConfig.list.forEach((j, jindex) => { obj.forEach(x => { if (jindex == x) { val = val + (val ? ',' : '') + j.val; } }) }) this.orderNewForm[index].value = val }, //日期 bindDateChange(e, index) { this.orderNewForm[index].value = e.target.value this.$forceUpdate() }, //时间 bindTimeChange(e, index) { this.orderNewForm[index].value = e.target.value }, //时间选择 getTimeranges(index) { this.isShow = true this.timerangesIndex = index }, //时间选择回调 confrim(e) { this.isShow = false; this.orderNewForm[this.timerangesIndex].value = e.time; let arrayNew = []; e.val.forEach(item => { arrayNew.push(Number(item)) }) this.timeranges = arrayNew; }, //关闭时间选择弹窗 cancels() { this.isShow = false; }, //sel选择 bindSelectChange(e, index, item) { this.$set(this.orderNewForm[index], 'value', item.wordsConfig.list[e.detail.value].val); }, //城市地址选择 changeRegion(index) { if (!this.orderNewForm[index].value) { this.addressInfoArea = []; } this.timerangesIndex = index; this.cityShow = Number(this.orderNewForm[index].valConfig.tabVal) + 1; this.display = true; if (CACHE_CITY[index]) { this.addressInfoArea = CACHE_CITY[index]; } }, //选择地址回调 OnChangeAddress(address) { // let addr = ''; let addr = address.map(v => v.regionName).join('/'); this.orderNewForm[this.timerangesIndex].value = addr; CACHE_CITY[this.timerangesIndex] = address; }, // 关闭地址弹窗; changeAddressClose() { this.display = false; }, /**上传文件*/ uploadpic(item) { let that = this; that.$util.uploadImageOne({ url: 'upload/image', name: 'multipart', model: "order", pid: 0 }, function(res) { let pics = item.value || [] pics.push(res); that.$set(item, 'value', pics); }); }, //删除图片 DelPic(index, indexs) { let pic = this.orderNewForm[index].value; this.orderNewForm[index].value.splice(indexs, 1); this.$set(this.orderNewForm[index], 'value', this.orderNewForm[index].value); }, } } </script> <style scoped lang="scss"> .item { font-size: 28rpx; color: #282828; margin-top: 20rpx; } .name{ width: 168rpx; } .virtual_form { .uni-input-wrapper { text-align: right; } .item-require { color: red; margin-right: 4rpx; } .item { padding: 27rpx 0; .pd0 { padding-bottom: 0; } .radio { margin: 0 22rpx 0 22rpx; padding: 10rpx 0; } .discount .placeholder { color: #ccc; text-align: right; font-size: 28rpx; } .discount { max-width: 480rpx; font-size: 28rpx; text-align: right; &.discount_voice { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 460rpx; text-align: right; } .iconfont { color: #515151; font-size: 20rpx; margin-left: 12rpx; } .num { font-size: 28rpx; margin-right: 20rpx; } } } } </style>