197 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
			
		
		
	
	
			197 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
 | 
						||
<template>
 | 
						||
    <view>
 | 
						||
        <u-picker @cancel='pickershow=false'
 | 
						||
                  :show="pickershow"
 | 
						||
                  ref="uPicker"
 | 
						||
                  :defaultIndex="defaultIndex"
 | 
						||
                  :columns="columns"
 | 
						||
                  @confirm="confirm"
 | 
						||
                  keyName='name'
 | 
						||
                  @change="changeHandler"></u-picker>
 | 
						||
    </view>
 | 
						||
</template>
 | 
						||
 | 
						||
<script>
 | 
						||
import * as api from '@/config/goods'
 | 
						||
import { mapGetters } from 'vuex'
 | 
						||
export default {
 | 
						||
    data() {
 | 
						||
        return {
 | 
						||
            columns: [],
 | 
						||
            pickershow: false,
 | 
						||
            provinceList: [],
 | 
						||
            cityList: [],
 | 
						||
            quList: [],
 | 
						||
            diqu: '',
 | 
						||
            form: {},
 | 
						||
            defaultIndex: [],
 | 
						||
            user: '',
 | 
						||
        }
 | 
						||
    },
 | 
						||
    props: {
 | 
						||
        defaultCode: {
 | 
						||
            type: Array,
 | 
						||
            default: [],
 | 
						||
        },
 | 
						||
    },
 | 
						||
    watch: {
 | 
						||
        defaultCode: {
 | 
						||
            deep: true,
 | 
						||
            handler(n) {
 | 
						||
                if (this.cityList.length > 0) {
 | 
						||
                    this.getDefaultIndex(n)
 | 
						||
                } else {
 | 
						||
                    this.getAllAreaList(this.user.pkSettleCountry).then((res) => {
 | 
						||
                        if (res) {
 | 
						||
                            this.getDefaultIndex(n)
 | 
						||
                        }
 | 
						||
                    })
 | 
						||
                }
 | 
						||
            },
 | 
						||
        },
 | 
						||
    },
 | 
						||
    created() {
 | 
						||
        this.user = uni.getStorageSync('User')
 | 
						||
        this.getAllAreaList(this.user.pkSettleCountry)
 | 
						||
        console.error(this.defaultCode)
 | 
						||
        this.getAllAreaList(this.user.pkSettleCountry).then((res) => {
 | 
						||
            if (res) {
 | 
						||
                this.getDefaultIndex(this.defaultCode,0)
 | 
						||
            }
 | 
						||
        })
 | 
						||
    },
 | 
						||
    methods: {
 | 
						||
        getDefaultIndex(arr) {
 | 
						||
            let a = this.provinceList.findIndex((item) => item.pkId == arr[0])
 | 
						||
            let b = this.cityList[a].arrList.findIndex((item) => item.pkId == arr[1])
 | 
						||
            let c = this.quList.findIndex((item) => item.pkId == arr[1])
 | 
						||
            let d = this.quList[c].arrList.findIndex((item) => item.pkId == arr[2])
 | 
						||
            this.columns = [
 | 
						||
                this.provinceList,
 | 
						||
                this.cityList[a].arrList,
 | 
						||
                this.quList[c].arrList,
 | 
						||
            ]
 | 
						||
            let diqu
 | 
						||
            this.defaultIndex = [a, b, d > -1 ? d : 0]
 | 
						||
            if (d > -1) {
 | 
						||
                diqu = `${this.provinceList[a].name}-${this.cityList[a].arrList[b].name}-${this.quList[c].arrList[d].name}`
 | 
						||
            } else {
 | 
						||
                diqu = `${this.provinceList[a].name}-${this.cityList[a].arrList[b].name}`
 | 
						||
            }
 | 
						||
            console.error(diqu)
 | 
						||
            this.$emit('getAddressData1', diqu)
 | 
						||
 | 
						||
 | 
						||
        },
 | 
						||
        setShow() {
 | 
						||
            this.pickershow = true
 | 
						||
        },
 | 
						||
        getAllAreaList(pkCountry) {
 | 
						||
            return new Promise((reslove, reject) => {
 | 
						||
                api
 | 
						||
                    .getAllAreaList({
 | 
						||
                        pkCountry: pkCountry,
 | 
						||
                    })
 | 
						||
                    .then((res) => {
 | 
						||
                        this.provinceList = res.data.provinceList
 | 
						||
                        // 市数组
 | 
						||
                        let cityList = []
 | 
						||
                        res.data.provinceList.forEach((element, index) => {
 | 
						||
                            cityList.push({
 | 
						||
                                pkId: element.pkId,
 | 
						||
                                arrList: [],
 | 
						||
                            })
 | 
						||
                            res.data.cityList.forEach((item, cndex) => {
 | 
						||
                                if (element.pkId == item.parent) {
 | 
						||
                                    cityList[index].arrList.push(item)
 | 
						||
                                }
 | 
						||
                            })
 | 
						||
                        })
 | 
						||
                        this.cityList = cityList
 | 
						||
                        // 区数组
 | 
						||
                        let quList = []
 | 
						||
                        res.data.cityList.forEach((element, index) => {
 | 
						||
                            quList.push({
 | 
						||
                                pkId: element.pkId,
 | 
						||
                                arrList: [],
 | 
						||
                            })
 | 
						||
                            res.data.countyList.forEach((item, cndex) => {
 | 
						||
                                if (element.pkId == item.parent) {
 | 
						||
                                    quList[index].arrList.push(item)
 | 
						||
                                }
 | 
						||
                            })
 | 
						||
                        })
 | 
						||
                        this.quList = quList
 | 
						||
                        this.columns = [
 | 
						||
                            res.data.provinceList,
 | 
						||
                            cityList[0].arrList,
 | 
						||
                            quList[0].arrList,
 | 
						||
                        ]
 | 
						||
                        reslove(true)
 | 
						||
                    })
 | 
						||
            })
 | 
						||
        },
 | 
						||
        changeHandler(e) {
 | 
						||
            const {
 | 
						||
                columnIndex,
 | 
						||
                value,
 | 
						||
                values, // values为当前变化列的数组内容
 | 
						||
                index,
 | 
						||
                indexs,
 | 
						||
                // 微信小程序无法将picker实例传出来,只能通过ref操作
 | 
						||
                picker = this.$refs.uPicker,
 | 
						||
            } = e
 | 
						||
            // 当第一列值发生变化时,变化第二列(后一列)对应的选项
 | 
						||
            if (columnIndex === 0) {
 | 
						||
                picker.setColumnValues(1, this.cityList[indexs[0]].arrList)
 | 
						||
                let arr = []
 | 
						||
                this.quList.forEach((item) => {
 | 
						||
                    if (item.pkId == this.cityList[indexs[0]].arrList[0].pkId) {
 | 
						||
                        arr = item.arrList
 | 
						||
                    }
 | 
						||
                })
 | 
						||
                picker.setColumnValues(2, arr)
 | 
						||
                // picker为选择器this实例,变化第二列对应的选项
 | 
						||
            } else if (columnIndex === 1) {
 | 
						||
                let arr = []
 | 
						||
                this.quList.forEach((item) => {
 | 
						||
                    if (item.pkId == this.cityList[indexs[0]].arrList[index].pkId) {
 | 
						||
                        arr = item.arrList
 | 
						||
                    }
 | 
						||
                })
 | 
						||
                picker.setColumnValues(2, arr)
 | 
						||
            }
 | 
						||
        },
 | 
						||
        // 回调参数为包含columnIndex、value、values
 | 
						||
        confirm(e) {
 | 
						||
            this.pickershow = false
 | 
						||
            if (e.value[2]) {
 | 
						||
                this.diqu = `${e.value[0].name}-${e.value[1].name}-${e.value[2].name}`
 | 
						||
                this.form.province = e.value[0].pkId
 | 
						||
                this.form.city = e.value[1].pkId
 | 
						||
                this.form.county = e.value[2].pkId
 | 
						||
            } else {
 | 
						||
                this.diqu = `${e.value[0].name}-${e.value[1].name}`
 | 
						||
                this.form.province = e.value[0].pkId
 | 
						||
                this.form.city = e.value[1].pkId
 | 
						||
                this.form.county = ''
 | 
						||
            }
 | 
						||
            this.$emit('addressData1', this.diqu, this.form)
 | 
						||
        },
 | 
						||
    },
 | 
						||
}
 | 
						||
</script>
 | 
						||
 | 
						||
<style lang="scss" scoped>
 | 
						||
.picker {
 | 
						||
  display: flex;
 | 
						||
  justify-content: space-between;
 | 
						||
  width: 100%;
 | 
						||
  border-width: 0.5px !important;
 | 
						||
  border-color: #dadbde !important;
 | 
						||
  border-style: solid;
 | 
						||
  border-radius: 4px;
 | 
						||
  padding: 6px 9px;
 | 
						||
}
 | 
						||
</style> |