Skip to content

RegionPicker 省市区选择器

此组件通常用于选择收货地址等场景。

TIP

由于每个项目对于省市区数据的要求不同,完整的省市区数据并不是每个项目都需要,所以该组件并没有内置完整的省市区数据。 如果需要完整的省市区数据可以在 插件市场 - 省市区 json 数据 上获取。

基础使用

  • 通过 show 属性设置组件显示状态。
  • 通过 values 属性设置选中项的下标。
  • 通过 regionprovinces、cities、areas 设置省市区数据。
  • 通过 @change@confirm 获取选中数据。
vue
<template>
    <hi-region-picker :region="regionJson" :values="values" :show="show" @close="show = false" @cancel="show = false" @confirm="handleConfirm"></hi-region-picker>
    <hi-button text="显示省市区选择器" @click="show = true"></hi-button>
</template>

<script setup>
    import { ref } from "vue";
    import regionJson from "@/uni_modules/hi-region-json";

    // 显示状态
    const show = ref(false);

    // 选中项下标
    const values = ref([0, 0, 0]);

    // 选择器确认按钮点击事件
    function handleConfirm(indexes, data) {
        console.log(indexes, data);
        values.value = indexes;
        show.value = false;
    }
</script>

配置数据

整体配置

通过 region 配置省市区整体数据。

vue
<template>
    <!-- 选择器 -->
    <hi-region-picker :region="regionJson" :values="values" :show="show" @close="show = false" @cancel="show = false" @confirm="handleConfirm"></hi-region-picker>

    <!-- 展示 -->
    <hi-cell :title="address" @click="show = true" rightIcon="__you"></hi-cell>
</template>

<script setup>
    import { ref } from "vue";
    import regionJson from "@/uni_modules/hi-region-json";

    // 显示状态
    const show = ref(false);

    // 选中项下标
    const values = ref([0, 0, 0]);

    // 选择的地址
    const address = ref("");

    // 选择器确认按钮点击事件
    function handleConfirm(indexes, data) {
        console.log(indexes, data);
        address.value = data?.province?.name + " " + data?.city?.name + " " + data?.area?.name;
        values.value = indexes;
        show.value = false;
    }
</script>

单独配置

  • 通过 provinces 配置省份数据。
  • 通过 cities 配置城市数据。
  • 通过 areas 配置县区数据。
  • 通过 @changeProvince 监听省份变化事件。
  • 通过 @changeCity 监听城市变化事件。
  • 通过 @changeArea 监听县区变化事件。
  • 通过 loading 设置是否显示加载状态。

提示

此种方式一般用于省市区数据是通过接口动态获取的场景。

vue
<template>
    <!-- 选择器 -->
    <hi-region-picker
        :provinces="provinces"
        :cities="cities"
        :areas="areas"
        :values="values"
        :show="show"
        :loading="loading"
        @close="show = false"
        @cancel="show = false"
        @changeProvince="onChangePrivice"
        @changeCity="onChangeCity"
        @confirm="handleConfirm"
    ></hi-region-picker>

    <!-- 展示 -->
    <hi-cell :title="address" @click="handleCellClick" rightIcon="__you"></hi-cell>
</template>

<script setup>
    import { ref } from "vue";

    // 省、市、区数据
    const provinces = ref([]);
    const cities = ref([]);
    const areas = ref([]);

    // 数据加载状态
    const loading = ref(false);

    // 显示状态
    const show = ref(false);

    // 选中项下标
    const values = ref([0, 0, 0]);

    // 选择的地址
    const address = ref("");

    // 选择器确认按钮点击事件
    function handleConfirm(indexes, data) {
        console.log(indexes, data);
        address.value = data?.province?.name + " " + data?.city?.name + " " + data?.area?.name;
        values.value = indexes;
        show.value = false;
    }

    // 单元格点击事件
    async function handleCellClick() {
        // 显示选择器
        show.value = true;

        // 判断是否有省份数据,没有的话就请求接口获取省份数据
        if(!provinces.value.length) {
            // 显示加载状态
            loading.value = true;

            // 请求接口获取省份数据
            // await getProvince(); // 此处为模拟请求

            // 此处模拟数据
            provinces.value = [{ name: "北京市" }, { name: "上海市" }, { name: "广东省" }];
        }

        // 获取数据后关闭加载状态
        loading.value = false;
    }

    // 省份变化事件
    async function onChangePrivice(index, data) {
        // 显示加载状态
        loading.value = true;

        // 查询对应的城市数据
        // await getCity(data); // 此处为模拟请求

        // 此处模拟数据
        cities.value = [{ name: "北京市" }, { name: "上海市" }, { name: "广州市" }];

        // 获取数据后关闭加载状态
        loading.value = false;
    }

    // 城市变化事件
    async function onChangeCity(index, data) {
        // 显示加载状态
        loading.value = true;

        // 查询对应的区数据
        // await getArea(data); // 此处为模拟请求

        // 此处模拟数据
        areas.value = [{ name: "通州区" }, { name: "闵行区" }, { name: "白云区" }];

        // 获取数据后关闭加载状态
        loading.value = false;
    }
</script>

Props

属性名说明类型默认值可选值版本
show是否显示Booleanfalsetrue-
values选中项下标Array[0, 0, 0]--
region完整的省市区数据Array[]--
provinces省份数据Array[]--
cities城市数据Array[]--
areas区数据Array[]--
keyName显示字段的属性名称Stringname--
closeOnClickOverlay点击蒙层时是否关闭Booleantruefalse-
loading是否显示加载状态Booleanfalsetrue-
returnZero切换后子项下标是否归零Booleanfalsetrue-
title标题String---
cancelText取消按钮文本String取消--
confirmText确认按钮文本String确认--
titleColor标题颜色String---
titleFontSize标题字体大小String---
titleFontWeight标题字体粗细String---
cancelColor取消按钮颜色String---
cancelFontSize取消按钮字体大小String---
confirmColor确认按钮颜色String---
confirmFontSize确认按钮字体大小String---
itemHeight列表项高度String---
itemFontSize列表项字体大小String---
itemColor列表项字体颜色String---
bg弹窗内容背景String---
radius弹窗内容圆角大小String---
height弹窗内容高度String---
maxHeight弹窗内容最大高度String---
mask是否显示蒙层Booleantruefalse-
maskBg蒙层背景String---
maskOpts蒙层配置Objectundefined参考-
loadingOpts加载配置Objectundefined参考-

Event

事件名说明回调参数版本
close点击遮罩触发的关闭事件--
cancel点击取消按钮触发的事件--
confirm点击确认按钮触发的事件indexes: 当前项的下标数据。datas: 当前项的省市区数据-
change切换事件indexes: 当前项的下标数据。datas: 当前项的省市区数据-
changeProvince省份切换事件index: 省份当前项的下标。province: 当前省份项数据-
changeCity城市切换事件index: 城市当前项的下标。city: 当前城市项数据-
changeDistrict区县切换事件index: 区县当前项的下标。area: 当前区项数据-
maskClick点击蒙层触发的事件--

样式变量

组件提供了以下样式变量,可以在使用时设置这些变量来修改组件的样式。

变量名默认值版本
--hi-region-picker-backgroundvar(--hi-background-element)-
--hi-region-picker-border-radius8px-
--hi-region-picker-max-height80%-
--hi-region-picker-height50%-
--hi-region-picker-width100%-
--hi-region-picker-displayflex-
--hi-region-picker-flex-directioncolumn-
--hi-region-picker-padding0 20px-
--hi-region-picker-positionfixed-
--hi-region-picker-left0-
--hi-region-picker-bottom0-
--hi-region-picker-z-indexvar(--hi-index-upper)-
--hi-region-picker-animation-duration300ms-
--hi-region-picker-animation-fill-modeforwards-
--hi-region-picker-animation-timing-functionlinear-
--hi-region-picker-header-displayflex-
--hi-region-picker-header-align-itemscenter-
--hi-region-picker-header-flex-shrink0-
--hi-region-picker-header-margin0 0 30px 0-
--hi-region-picker-header-padding30rpx 0-
--hi-region-picker-button-flex-shrink0-
--hi-region-picker-button-font-weight500-
--hi-region-picker-button-flex1-
--hi-region-picker-button-displayflex-
--hi-region-picker-button-flex-directionrow-
--hi-region-picker-cancel-font-sizeinherit-
--hi-region-picker-cancel-colorvar(--hi-color-middle)-
--hi-region-picker-cancel-font-weightvar(--hi-region-picker-button-font-weight, 500)-
--hi-region-picker-cancel-justify-contentflex-start-
--hi-region-picker-confirm-font-sizeinherit-
--hi-region-picker-confirm-colorvar(--hi-theme-primary)-
--hi-region-picker-confirm-font-weightvar(--hi-region-picker-button-font-weight, 500)-
--hi-region-picker-confirm-justify-contentflex-end-
--hi-region-picker-title-flex2-
--hi-region-picker-title-font-weight700-
--hi-region-picker-title-colorinherit-
--hi-region-picker-title-font-size1.25em-
--hi-region-picker-title-text-aligncenter-
--hi-region-picker-title-flex-shrink0-
--hi-region-picker-picker-view-width100%-
--hi-region-picker-picker-view-flex1-
--hi-region-picker-item-height3.5em-
--hi-region-picker-item-displayflex-
--hi-region-picker-item-align-itemscenter-
--hi-region-picker-item-justify-contentcenter-
--hi-region-picker-item-colorinherit-
--hi-region-picker-item-font-sizeinherit-
--hi-region-picker-item-font-weight500-
--hi-region-picker-loading-positionabsolute-
--hi-region-picker-loading-width100% -
--hi-region-picker-loading-height100%-
--hi-region-picker-loading-left0-
--hi-region-picker-loading-top0-
--hi-region-picker-loading-right0-
--hi-region-picker-loading-bottom0-
--hi-region-picker-loading-displayflex-
--hi-region-picker-loading-flex-directioncolumn-
--hi-region-picker-loading-align-itemscenter-
--hi-region-picker-loading-justify-contentcenter-
--hi-region-picker-loading-backgroundvar(--hi-background-element)-
--hi-region-picker-loading-z-index6-
--hi-region-picker-loading-font-size1.5em-
--hi-region-picker-loading-opacity0.8-

基于 MIT 许可发布