Skip to content

Address 地址

介绍

用于进行四级地址选择。

选择自定义地址

html
<template>
  <nut-address
    v-model:visible="visible"
    :province="address.province"
    :city="address.city"
    :country="address.country"
    :town="address.town"
    @change="onChange"
    @close="onClose"
  ></nut-address>
</template>
ts
const visible = ref(false);

const address = reactive({
  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: []
});

function onChange(event) {
  const name = address[event.next];

  if (!name || name.length < 1) {
    visible.value = false;
  }
}

function onClose(event) {
  console.log(event);
}

选择省市区

如果想选中某个省市区,需要在 model-value 中按照 provincecitycountrytown 的顺序配置想要展示的地区 id 值, 并且保证有能查询到对应的省市区数据即可。

html
<template>
  <nut-address
    v-model="value"
    v-model:visible="visible"
    :province="address.province"
    :city="address.city"
    :country="address.country"
    :town="address.town"
    @change="onChange"
    @close="onClose"
  ></nut-address>
</template>
ts
const visible = ref(false);

const value = ref([1, 7, 3]);

const address = reactive({
  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: []
});

function onChange(event) {
  const name = address[event.next];

  if (!name || name.length < 1) {
    visible.value = false;
  }
}

function onClose(event) {
  value.value = [
    event.data.province.id,
    event.data.city.id,
    event.data.country.id
  ];
}

选择自定义地址2

html
<template>
  <nut-address
    v-model="value"
    v-model:visible="visible"
    type="custom2"
    :province="address.province"
    :city="address.city"
    :country="address.country"
    :town="address.town"
    @change="onChange"
    @close="onClose"
  ></nut-address>
</template>
ts
const visible = ref(false);

const value = ref([1, 7, 3]);

const address = reactive({
  province: [
    { id: 1, name: "北京", title: "B" },
    { id: 2, name: "广西", title: "G" },
    { id: 3, name: "江西", title: "J" },
    { id: 4, name: "四川", title: "S" },
    { id: 5, name: "浙江", title: "Z" }
  ],
  city: [
    { id: 7, name: "朝阳区", title: "C" },
    { id: 8, name: "崇文区", title: "C" },
    { id: 9, name: "昌平区", title: "C" },
    { id: 6, name: "石景山区", title: "S" },
    { id: 3, name: "八里庄街道", title: "B" },
    { id: 9, name: "北苑", title: "B" }
  ],
  country: [
    { id: 3, name: "八里庄街道", title: "B" },
    { id: 9, name: "北苑", title: "B" },
    { id: 4, name: "常营乡", title: "C" }
  ],
  town: []
});

function onChange(event) {
  const name = address[event.next];

  if (!name || name.length < 1) {
    visible.value = false;
  }
}

function onClose(event) {
  value.value = [
    event.data.province.id,
    event.data.city.id,
    event.data.country.id
  ];
}

选择已有地址

html
<template>
  <nut-address
    v-model:visible="visible"
    type="exist"
    :exist-address="existAddress"
    exist-address-title="配送至"
    :is-show-custom-address="false"
    @selected="onSelected"
    @close="onClose"
  ></nut-address>
</template>
ts
const visible = ref(false);

const existAddress = ref([
  {
    id: 1,
    addressDetail: "",
    cityName: "次渠镇",
    countyName: "通州区",
    provinceName: "北京市",
    selectedAddress: true,
    townName: "",
    name: "探探鱼",
    phone: "182****1718"
  },
  {
    id: 2,
    addressDetail: "",
    cityName: "钓鱼岛全区",
    countyName: "",
    provinceName: "钓鱼岛",
    selectedAddress: false,
    townName: "",
    name: "探探鱼",
    phone: "182****1718"
  },
  {
    id: 3,
    addressDetail: "京东大厦",
    cityName: "大兴区",
    countyName: "科创十一街18号院",
    provinceName: "北京市",
    selectedAddress: false,
    townName: "",
    name: "探探鱼",
    phone: "182****1718"
  }
]);

function onSelected(prev, item, list) {
  console.log(prev);
  console.log(item);
  console.log(list);
}

function onClose(event) {
  if (event.type == "exist") {
    const { provinceName, cityName, countyName, townName, addressDetail } = event.data;

    console.log(provinceName + cityName + countyName + townName + addressDetail);
  } else {
    console.log(event);
  }
}

自定义图标

html
<template>
  <nut-address v-model:visible="visible">
    <template #unselectedIcon>
      <nut-icon name="heart1"></nut-icon>
    </template>

    <template #icon>
      <nut-icon name="heart-fill" color="#ff0000"></nut-icon>
    </template>

    <template #bottom>
      <nut-button>自定义按钮</nut-button>
    </template>
  </nut-address>
</template>

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

html
<template>
  <nut-address
    v-model:visible="visible"
    type="exist"
    :exist-address="existAddress"
    :province="address.province"
    :city="address.city"
    :country="address.country"
    :town="address.town"
    @change="onChange"
    @selected="onSelected"
    @switch-module="onSwitchModule"
    @close-mask="onMaskClose"
    @close="onClose"
  ></nut-address>
</template>
ts
const visible = ref(false);

const address = reactive({
  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: []
});

const existAddress = ref([
  {
    id: 1,
    addressDetail: "",
    cityName: "次渠镇",
    countyName: "通州区",
    provinceName: "北京市",
    selectedAddress: true,
    townName: "",
    name: "探探鱼",
    phone: "182****1718"
  },
  {
    id: 2,
    addressDetail: "",
    cityName: "钓鱼岛全区",
    countyName: "",
    provinceName: "钓鱼岛",
    selectedAddress: false,
    townName: "",
    name: "探探鱼",
    phone: "182****1718"
  },
  {
    id: 3,
    addressDetail: "京东大厦",
    cityName: "大兴区",
    countyName: "科创十一街18号院",
    provinceName: "北京市",
    selectedAddress: false,
    townName: "",
    name: "探探鱼",
    phone: "182****1718"
  }
]);

function onChange(event) {
  console.log("change", event);
}

function onSelected(prev, item, list) {
  console.log("selected", prev, item, list);
}

function onSwitchModule(event) {
  console.log("switch-module", event);
}

function onMaskClose(event) {
  console.log("close-mask", event);
}

function onClose(event) {
  console.log("close", event);
}

API

Props

参数说明类型可选值默认值
v-model设置默认选中值Array-[]
v-model:visible是否打开地址选择boolean-false
type地址选择类型stringexist / custom / custom2custom
province省,每个省的对象中,必须有 name 字段,如果类型选择 custom2,必须指定 title 字段为首字母Array-[]
city市,每个市的对象中,必须有 name 字段,如果类型选择 custom2,必须指定 title 字段为首字母Array-[]
country县,每个县的对象中,必须有 name 字段,如果类型选择 custom2,必须指定 title 字段为首字母Array-[]
town乡 / 镇,每个乡 / 镇的对象中,必须有 name 字段,如果类型选择 custom2,必须指定 title 字段为首字母Array-[]
height弹层中内容容器的高度(typecustom2 时有效)string / number-200px
exist-address已存在地址列表,每个地址对象中,必传值 provinceNamecityNamecountyNametownNameaddressDetailselectedAddress(字段解释见下表)Array-[]
is-show-custom-address是否可以切换自定义地址选择(typeexist 时有效)boolean-true
custom-address-title自定义地址选择文案(typecustom 时有效)string-请选择所在地区
exist-address-title已有地址文案(typeexist 时有效)string-配送至
custom-and-exist-title自定义地址与已有地址切换按钮文案(typeexist 时有效)string-选择其他地址
columns-placeholder列提示文字string / Array-请选择

字段解释

字段含义
provinceName省的名字
cityName市的名字
countyName县的名字
townName乡 / 镇的名字
addressDetail具体地址
selectedAddress字段用于判断当前地址列表的选中项

Events

事件名说明类型
change自定义选择地址时,选择地区时触发(event: ChangeEvent) => void
selected选择已有地址列表时触发(prev, item, list) => void
close地址选择弹框关闭时触发(event: CloseEvent) => void
close-mask点击遮罩层或点击右上角叉号关闭时触发(event: MaskCloseEvent) => void
switch-module点击“选择其他地址”或自定义地址选择左上角返回按钮触发(event: ModuleSwitchEvent) => void

ChangeEvent

参数说明
custom当前点击的行政区域(province:省 / city:市 / country:县 / town:乡)
next当前点击的行政区域的下一级(province:省 / city:市 / country:县 / town:乡)
value当前点击的行政区域的值

SelectedEvent

参数说明
prev(第 1 个参数)选择前选中的地址
item(第 2 个参数)当前选中的地址
list(第 3 个参数)选择完之后的已有地址列表

CloseEvent

参数说明
type地址选择类型(exist / custom / custom2)
data选择地址的值

MaskCloseEvent

参数说明
closeWay关闭方式(self / mask / cross)

ModuleSwitchEvent

参数说明
type切换类型(exist / custom / custom2)

Slots

名称说明
bottom可自定义底部
icon自定义选中项的图标
unselectedIcon未选中地址时的图标
closeIcon关闭弹层的图标
backIcon自定义地址与已有地址切换时返回的图标

主题定制

样式变量

组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 ConfigProvider 组件

名称默认值
--nut-address-region-tab-linelinear-gradient(90deg, var(--nut-primary-color) 0%, rgba(#fa2c19, 0.15) 100%)
--nut-address-icon-colorvar(--nut-primary-color)
--nut-address-header-title-font-size18px
--nut-address-header-title-color#262626
--nut-address-region-tab-font-size13px
--nut-address-region-tab-color#1d1e1e
--nut-address-region-tab-active-item-font-weightbold
--nut-address-region-tab-line-border-radius0
--nut-address-region-tab-line-opacity1
--nut-address-region-item-color#333
--nut-address-region-item-font-sizevar(--nut-font-size-1)
--nut-address-item-margin-right9px

MIT Licensed