189 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Vue
		
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			5.3 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(uni.getStorageSync('pkCountry')||this.user.pkSettleCountry).then((res) => {
 | 
						||
            if (res) {
 | 
						||
              this.getDefaultIndex(n)
 | 
						||
            }
 | 
						||
          })
 | 
						||
        }
 | 
						||
      },
 | 
						||
    },
 | 
						||
  },
 | 
						||
  created() {
 | 
						||
    this.user = uni.getStorageSync('User')
 | 
						||
    this.getAllAreaList(uni.getStorageSync('pkCountry')||this.user.pkSettleCountry)
 | 
						||
  },
 | 
						||
  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}`
 | 
						||
      }
 | 
						||
      this.$emit('getAddressData', 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('addressData', 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> |