doc.md 10 KB

Address 地址选择

选择自定义地址

<div class="address-list init" @click="showAddress">
    <div class="titile">选择地址</div>
    <div class="choose">{{text1}}</div>
</div>

<nut-address 
    v-model="showPopup" 
    :province="province" 
    :city="city" 
    :country="country" 
    :town="town" 
    customAddressTitle="请选择所在地区"
    @onChange="onChange1" 
    @close="close1">
</nut-address>

<script>
export default {
  data() {
    return {
        showPopup:false,
        province:[{"id":1,"name":"北京"},{"id":2,"name":"广西"},{"id":3,"name":"江西"},{"id":4,"name":"四川"}], // 省
        city:[{"id":7,"name":"朝阳区"},{"id":8,"name":"崇文区"},{"id":9,"name":"昌平区"},{"id":6,"name":"石景山区"}],// 市
        country:[{"id":3,"name":"八里庄街道"},{"id":9,"name":"北苑"},{"id":4,"name":"常营乡"}],// 县
        town:[], // 镇 必传值:name
    }
  },
  methods: {
      showAddress(){
        this.showPopup = true 
      },
      onChange1(cal){
        // 判断下一个行政区列表的内容是否有值
        if(this[cal.next].length < 1){
          this.showPopup = false
        }
      },
      close1(val){
        this.text1 = val.data.addressStr 
      }
  }
}
</script>

选择已有地址

<div class="address-list other" @click="showAddressExist">
  <div class="titile">选择地址</div>
  <div class="choose">{{text2}}</div>
</div>

<nut-address 
  v-model="showPopupExist" 
  type="exist" 
  :existAddress="existAddress" 
  @onChange="onChange2" 
  @close="close2" 
  :isShowCustomAddress="false" 
  existAddressTitle="配送至"
  @selected="selected2">
</nut-address>


<script>
export default {
  data() {
    return {
        showPopupExist:false,
        existAddress:[
          {"id":1,"addressDetail":"th ","cityName":"石景山区","countyName":"城区","provinceName":"北京","selectedAddress":true,"townName":""},
          {"id":2,"addressDetail":"12_ ","cityName":"电饭锅","countyName":"扶绥县","provinceName":"北京","selectedAddress":false,"townName":""},
          {"id":3,"addressDetail":"发大水比 ","cityName":"放到","countyName":"广宁街道","provinceName":"钓鱼岛全区","selectedAddress":false,"townName":""},
          {"id":4,"addressDetail":"还是想吧百度吧 ","cityName":"研发","countyName":"八里庄街道","provinceName":"北京","selectedAddress":false,"townName":""},
        ],
        text2:'请选择地址',
    }
  },
  methods: {
      showAddressExist(){
        this.showPopupExist = true
      },

      onChange2(cal){
        console.log('change2',cal)
        if(this[cal.next].length < 1){
          this.showPopupOther = false
        }
      },
      
      close2(val){
        console.log(val)
        if(val.type == 'exist'){
          this.text2 = val.data.provinceName+val.data.cityName+val.data.countyName+val.data.townName+val.data.addressDetail
        }else{
          this.text2 = val.data.addressStr
        }
      },
      selected2(prevExistAdd,nowExistAdd,arr){
        console.log(prevExistAdd)
        console.log(nowExistAdd)
      },
  }
}
</script>

自定义图标

<div class="address-list other" @click="showCustomImg">
    <div class="titile">选择地址</div>
    <div class="choose">{{text3}}</div>
</div>

<nut-address 
  v-model="showPopupCustomImg" 
  type="exist" 
  :existAddress="existAddress" 
  @onChange="onChange3" 
  @close="close3" 
  :isShowCustomAddress="false" 
  @selected="selected3" 
  :defaultIcon="defaultIcon" 
  :selectedIcon='selectedIcon'>
</nut-address>


<script>
export default {
  data() {
    return {
        showPopupCustomImg:false,
        selectedIcon:require('../../assets/svg/checked.svg'),
        defaultIcon:require('../../assets/svg/unchecked.svg'),
        existAddress:[
          {"id":1,"addressDetail":"th ","cityName":"石景山区","countyName":"城区","provinceName":"北京","selectedAddress":true,"townName":""},
          {"id":2,"addressDetail":"12_ ","cityName":"电饭锅","countyName":"扶绥县","provinceName":"北京","selectedAddress":false,"townName":""},
          {"id":3,"addressDetail":"发大水比 ","cityName":"放到","countyName":"广宁街道","provinceName":"钓鱼岛全区","selectedAddress":false,"townName":""},
          {"id":4,"addressDetail":"还是想吧百度吧 ","cityName":"研发","countyName":"八里庄街道","provinceName":"北京","selectedAddress":false,"townName":""},
        ],
        tex3:'请选择地址',
    }
  },
  methods: {
      showCustomImg(){
        this.showPopupCustomImg = true
      },

      onChange3(cal){
        console.log('change2',cal)
        if(this[cal.next].length < 1){
          this.showPopupOther = false
        }
      },
      
      close3(val){
        console.log(val)
        if(val.type == 'exist'){
          this.text3 = val.data.provinceName+val.data.cityName+val.data.countyName+val.data.townName+val.data.addressDetail
        }else{
          this.text3 = val.data.addressStr
        }
      },
      selected3(prevExistAdd,nowExistAdd,arr){
        console.log(prevExistAdd)
        console.log(nowExistAdd)
      },
  }
}
</script>

自定义地址与已有地址切换

<div class="address-list other" @click="showAddressOther">
    <div class="titile">选择地址</div>
    <div class="choose">{{text2}}</div>
</div>
<nut-address 
    v-model="showPopupOther" 
    type="exist" 
    :existAddress="existAddress" 
    :province="province" 
    :city="city" 
    :country="country" 
    :town="town" 
    @onChange="onChange4" 
    @close="close4" 
    @selected="selected4">
</nut-address>


<script>
export default {
  data() {
    return {
      showPopupOther:false,
      existAddress:[
        {"id":1,"addressDetail":"th ","cityName":"石景山区","countyName":"城区","provinceName":"北京","selectedAddress":true,"townName":""},
        {"id":2,"addressDetail":"12_ ","cityName":"电饭锅","countyName":"扶绥县","provinceName":"北京","selectedAddress":false,"townName":""},
        {"id":3,"addressDetail":"发大水比 ","cityName":"放到","countyName":"广宁街道","provinceName":"钓鱼岛全区","selectedAddress":false,"townName":""},
        {"id":4,"addressDetail":"还是想吧百度吧 ","cityName":"研发","countyName":"八里庄街道","provinceName":"北京","selectedAddress":false,"townName":""},
      ], // 已有地址列表 必传值:provinceName、cityName、countyName、townName、addressDetail 、selectedAddress
      province:[{"id":1,"name":"北京"},{"id":2,"name":"广西"},{"id":3,"name":"江西"},{"id":4,"name":"四川"}], // 省
      city:[{"id":7,"name":"朝阳区"},{"id":8,"name":"崇文区"},{"id":9,"name":"昌平区"},{"id":6,"name":"石景山区"}],// 市
      country:[{"id":3,"name":"八里庄街道"},{"id":9,"name":"北苑"},{"id":4,"name":"常营乡"}],// 县
      town:[], // 镇 必传值:name
    };
  },
  methods: {
    showAddressOther(){
        this.showPopupOther = true
    },
    onChange4(cal){
        if(this[cal.next].length < 1){
          this.showPopupOther = false
        }
    },
    close4(val){
        if(val.type == 'exist'){
          this.text2 = val.data.provinceName+val.data.cityName+val.data.countyName+val.data.townName+val.data.addressDetail
        }else{
          this.text2 = val.data.addressStr
        }
    },
  
    selected4(prevExistAdd,nowExistAdd,arr){
      console.log(prevExistAdd)
      console.log(nowExistAdd)
    }
  }
}
</script>

API

字段 说明 类型 默认值
v-model 是否打开地址选择 String ''
type 地址选择类型 exist/custom String custom
province 省,每个省的对象中,必须有 name 字段 Array []
city 市,每个市的对象中,必须有 name 字段 Array []
country 县,每个县的对象中,必须有 name 字段 Array []
town 乡/镇,每个乡/镇的对象中,必须有 name 字段 Array []
existAddress 已存在地址列表,每个地址对象中,必传值provinceName、cityName、countyName、townName、addressDetail、selectedAddress(字段解释见下) Array []
defaultIcon 已有地址列表默认图标,type=‘exist’ 时生效 string ''
selectedIcon 已有地址列表选中图标,type=‘exist’ 时生效 string ''
isShowCustomAddress 是否可以切换自定义地址选择,type=‘exist’ 时生效 Boolean true
customAddressTitle 自定义地址选择标题,type='custom' 时生效 string '请选择所在地区'
existAddressTitle 已有地址标题 ,type=‘exist’ 时生效 string '配送至'
  • provinceName 省的名字
  • cityName 市的名字
  • countyName 县的名字
  • townName 乡/镇的名字
  • addressDetail 具体地址
  • selectedAddress 字段用于判断当前地址列表的选中项。

Event

字段 说明 回调参数
onChange 自定义选择地址时,选择地区时触发 参考 onChange
selected 选择已有地址列表时触发 参考 selected
close 地址选择弹框关闭时触发 参考 close

onChange 回调参数

参数 说明 可能值
custom 当前点击的行政区域 province(省) / city(市) / country(县) / town(乡)
next 当前点击的行政区域的下一级 province(省) / city(市) / country(县) / town(乡)
value 当前点击的行政区域的值(返回传入的值) {}

selected 回调参数

参数 说明 可能值
第一个参数(prevExistAdd) 选择前选中的地址 {}
第二个参数(nowExistAdd) 当前选中的地址 {}
第三个参数(arr) 选择完之后的已有地址列表(selectedAddress 值发生改变) {}

close 回调参数

参数 说明 可能值
type 地址选择类型 exist/custom exist/custom
data 选择地址的值,custom 时,addressStr 为选择的地址组合 {}

注:点击叉号或者点击遮罩层关闭地址选择,不会触发 close 事件。