diff --git a/packages/vant/src/area/Area.tsx b/packages/vant/src/area/Area.tsx index ef96f3a8e..2f7b2af62 100644 --- a/packages/vant/src/area/Area.tsx +++ b/packages/vant/src/area/Area.tsx @@ -16,7 +16,7 @@ import { createNamespace, } from '../utils'; import { pickerSharedProps } from '../picker/Picker'; -import { formatDataForCascade } from './utils'; +import { INHERIT_PROPS, INHERIT_SLOTS, formatDataForCascade } from './utils'; // Components import { Picker } from '../picker'; @@ -26,25 +26,6 @@ import type { AreaList } from './types'; const [name, bem] = createNamespace('area'); -const INHERIT_SLOTS = [ - 'title', - 'cancel', - 'confirm', - 'toolbar', - 'columns-top', - 'columns-bottom', -] as const; -const INHERIT_PROPS = [ - 'title', - 'loading', - 'readonly', - 'optionHeight', - 'swipeDuration', - 'visibleOptionNum', - 'cancelButtonText', - 'confirmButtonText', -] as const; - const areaProps = extend({}, pickerSharedProps, { modelValue: String, columnsNum: makeNumericProp(3), @@ -66,15 +47,7 @@ export default defineComponent({ setup(props, { emit, slots }) { const codes = ref([]); - - const columns = computed(() => - formatDataForCascade( - props.areaList, - props.columnsNum, - props.columnsPlaceholder - ) - ); - + const columns = computed(() => formatDataForCascade(props)); const onChange = (...args: unknown[]) => emit('change', ...args); const onCancel = (...args: unknown[]) => emit('cancel', ...args); const onConfirm = (...args: unknown[]) => emit('confirm', ...args); diff --git a/packages/vant/src/area/utils.ts b/packages/vant/src/area/utils.ts index a3a8d9720..0af32ccea 100644 --- a/packages/vant/src/area/utils.ts +++ b/packages/vant/src/area/utils.ts @@ -1,8 +1,27 @@ -import type { AreaList } from '.'; +import type { AreaProps } from '.'; import type { PickerOption } from '../picker'; const EMPTY_CODE = '000000'; +export const INHERIT_SLOTS = [ + 'title', + 'cancel', + 'confirm', + 'toolbar', + 'columns-top', + 'columns-bottom', +] as const; +export const INHERIT_PROPS = [ + 'title', + 'loading', + 'readonly', + 'optionHeight', + 'swipeDuration', + 'visibleOptionNum', + 'cancelButtonText', + 'confirmButtonText', +] as const; + const makeOption = ( text = '', value = EMPTY_CODE, @@ -13,20 +32,19 @@ const makeOption = ( children, }); -export function formatDataForCascade( - { city_list: city, county_list: county, province_list: province }: AreaList, - columnsNum: number | string, - placeholder: string[] -) { +export function formatDataForCascade({ + areaList, + columnsNum, + columnsPlaceholder: placeholder, +}: AreaProps) { + const { + city_list: city, + county_list: county, + province_list: province, + } = areaList; const showCity = columnsNum > 1; const showCounty = columnsNum > 2; - const getCityChildren = () => { - if (showCounty) { - return placeholder.length ? [makeOption(placeholder[1])] : []; - } - }; - const getProvinceChildren = () => { if (showCity) { return placeholder.length @@ -45,6 +63,12 @@ export function formatDataForCascade( const cityMap = new Map(); if (showCity) { + const getCityChildren = () => { + if (showCounty) { + return placeholder.length ? [makeOption(placeholder[1])] : []; + } + }; + Object.keys(city).forEach((code) => { const option = makeOption(city[code], code, getCityChildren()); cityMap.set(code.slice(0, 4), option); @@ -68,9 +92,7 @@ export function formatDataForCascade( const options = Array.from(provinceMap.values()) as PickerOption[]; if (placeholder.length) { - const county = showCounty - ? [makeOption(placeholder[2], EMPTY_CODE)] - : undefined; + const county = showCounty ? [makeOption(placeholder[2])] : undefined; const city = showCity ? [makeOption(placeholder[1], EMPTY_CODE, county)] : undefined;