zx-address 四级地址选择
地址选择组件,支持自定义地址选择和已有地址选择两种模式。
平台兼容性
引入
import ZxAddress from '@tanzhenxing/zx-address/zx-address.vue';
代码演示
基础用法
<template>
<view>
<zx-button @click="showAddress = true">选择地址</zx-button>
<zx-address
v-model="showAddress"
:province="province"
:city="city"
:country="country"
:town="town"
custom-address-title="请选择所在地区"
@change="onChange"
@close="onClose"
/>
</view>
</template>
<script setup>
import { ref } from 'vue'
const showAddress = ref(false)
const province = ref([
{ id: 1, name: '北京' },
{ id: 2, name: '广西' },
{ id: 3, name: '江西' },
{ id: 4, name: '四川' }
])
const city = ref([
{ id: 7, name: '朝阳区' },
{ id: 8, name: '崇文区' },
{ id: 9, name: '昌平区' },
{ id: 6, name: '石景山区' }
])
const country = ref([
{ id: 3, name: '八里庄街道' },
{ id: 9, name: '北苑' },
{ id: 4, name: '常营乡' }
])
const town = ref([])
const onChange = (data) => {
console.log('地址改变:', data)
// 根据选择的层级动态加载下一级数据
if (data.next && data.next.length > 0) {
// 可以在这里请求下一级数据
} else {
// 选择完成,关闭弹窗
showAddress.value = false
}
}
const onClose = (data) => {
console.log('关闭弹窗:', data)
if (data.type === 'custom') {
console.log('选择的地址:', data.data.addressStr)
}
}
</script>
选择已有地址
<template>
<view>
<zx-button @click="showExistAddress = true">选择已有地址</zx-button>
<zx-address
v-model="showExistAddress"
type="exist"
:exist-address="existAddress"
exist-address-title="配送至"
:is-show-custom-address="false"
@selected="onSelected"
@close="onClose"
/>
</view>
</template>
<script setup>
import { ref } from 'vue'
const showExistAddress = ref(false)
const existAddress = ref([
{
id: 1,
name: '张三',
tel: '13800138000',
addressDetail: 'xx小区xx号楼xx单元xx室',
cityName: '石景山区',
countyName: '城区',
provinceName: '北京',
townName: '',
selectedAddress: true
},
{
id: 2,
name: '李四',
tel: '13900139000',
addressDetail: 'yy大厦yy层yy室',
cityName: '朝阳区',
countyName: '建外街道',
provinceName: '北京',
townName: '',
selectedAddress: false
}
])
const onSelected = (item, index, list) => {
console.log('选中地址:', item)
console.log('地址索引:', index)
console.log('地址列表:', list)
}
const onClose = (data) => {
console.log('关闭弹窗:', data)
}
</script>
自定义图标
<template>
<zx-address
v-model="showAddress"
type="exist"
:exist-address="existAddress"
:default-icon="defaultIcon"
:selected-icon="selectedIcon"
@selected="onSelected"
/>
</template>
<script setup>
import { ref } from 'vue'
const showAddress = ref(false)
const defaultIcon = ref('circle')
const selectedIcon = ref('success')
const existAddress = ref([
// ... 地址数据
])
const onSelected = (item, index, list) => {
console.log('选中地址:', item)
}
</script>
自定义地址与已有地址切换
<template>
<zx-address
v-model="showAddress"
type="all"
:province="province"
:city="city"
:country="country"
:town="town"
:exist-address="existAddress"
:show-tabs="true"
@change="onChange"
@selected="onSelected"
@close="onClose"
/>
</template>
<script setup>
import { ref } from 'vue'
const showAddress = ref(false)
// 省市区数据
const province = ref([...])
const city = ref([...])
const country = ref([...])
const town = ref([])
// 已有地址数据
const existAddress = ref([...])
const onChange = (data) => {
// 处理自定义地址选择
}
const onSelected = (item, index, list) => {
// 处理已有地址选择
}
const onClose = (data) => {
// 处理关闭事件
}
</script>
API
Props
参数 | 说明 | 类型 | 默认值 |
---|
v-model | 控制弹窗显示隐藏 | Boolean | false |
title | 弹窗标题 | String | 选择地址 |
show-tabs | 是否显示标签栏 | Boolean | true |
custom-address-title | 自定义地址标题 | String | 请选择所在地区 |
exist-address-title | 已有地址标题 | String | 配送至 |
province | 省份数据 | Array | [] |
city | 城市数据 | Array | [] |
country | 区县数据 | Array | [] |
town | 乡镇数据 | Array | [] |
exist-address | 已有地址列表 | Array | [] |
is-show-custom-address | 是否显示自定义地址 | Boolean | true |
close-on-click-overlay | 点击遮罩是否关闭 | Boolean | true |
default-icon | 默认选中的图标 | String | '' |
selected-icon | 选中状态的图标 | String | '' |
type | 组件类型 | String | all |
type 可选值
值 | 说明 |
---|
all | 显示自定义地址和已有地址两个标签页 |
exist | 只显示已有地址 |
custom | 只显示自定义地址 |
Events
事件名 | 说明 | 回调参数 |
---|
change | 自定义地址选择改变时触发 | data: { next: string, value: Array, selectedData: Object } |
close | 弹窗关闭时触发 | data: { type: string, data: Object } |
selected | 选中已有地址时触发 | item: Object, index: Number, list: Array |
数据结构
省市区数据格式
[
{
id: 1, // 唯一标识
name: '北京' // 显示名称
}
]
已有地址数据格式
[
{
id: 1, // 唯一标识
name: '张三', // 姓名
tel: '13800138000', // 电话
provinceName: '北京', // 省份名称
cityName: '朝阳区', // 城市名称
countyName: '建外街道', // 区县名称
townName: '', // 乡镇名称
addressDetail: 'xx小区xx号楼', // 详细地址
selectedAddress: true // 是否选中
}
]
change 事件回调参数
参数 | 说明 | 类型 |
---|
next | 下一级数据类型 | String |
value | 当前选中的值数组 | Array |
selectedData | 当前选中的数据对象 | Object |
next 可能的值
值 | 说明 |
---|
city | 需要加载城市数据 |
country | 需要加载区县数据 |
town | 需要加载乡镇数据 |
'' | 选择完成 |
close 事件回调参数
参数 | 说明 | 类型 |
---|
type | 关闭时的类型 | String |
data | 相关数据 | Object |
type 可能的值
值 | 说明 |
---|
custom | 自定义地址选择 |
exist | 已有地址选择 |
注意事项
- 省市区数据需要按照指定格式提供,包含
id
和 name
字段 - 已有地址数据需要包含完整的地址信息字段
- 组件内部会根据
change
事件的 next
参数来判断是否需要加载下一级数据 - 当
next
为空字符串时,表示选择完成,建议关闭弹窗 - 组件支持 H5、小程序、App 三端,使用了 uni-app 的跨平台特性