From 92d034e0e124928179f072224e9c2c1ad87fc1b2 Mon Sep 17 00:00:00 2001 From: Tevin <tingquanren@163.com> Date: Mon, 31 Jul 2023 11:43:45 +0800 Subject: [PATCH] 地址联动组件升级,支持第四级街道,数据采用异步 --- forms/chinaArea/ChinaLocations.js | 181 ++++++++++++++++++++++++++++++++------------- 1 files changed, 129 insertions(+), 52 deletions(-) diff --git a/forms/chinaArea/ChinaLocations.js b/forms/chinaArea/ChinaLocations.js index 32c57c1..b2e6c4e 100644 --- a/forms/chinaArea/ChinaLocations.js +++ b/forms/chinaArea/ChinaLocations.js @@ -1,54 +1,126 @@ /** - * ChinaLocations For Normal + * ChinaLocations For WeApp * @author Tevin */ -import ChinaLocationData from './ChinaLocationData.json'; +import Taro from '@tarojs/taro'; +import project from '@project'; +import { $hostBoot } from '@components/bases/HostBoot'; +import { Tools } from '@components/common/Tools'; -const locationTree = []; +let locationTreeLv3 = []; +let locationTreeLv4 = []; +let locationRes = {}; +let readyCallback = () => { }; -Object.keys(ChinaLocationData).forEach((code1) => { - const province = { - label: ChinaLocationData[code1].name, - value: code1, - children: [], - }; - const children1 = ChinaLocationData[code1].children; - Object.keys(children1).forEach((code2) => { - const city = { - label: children1[code2].name, - value: code2, - area: children1[code2].area, // 电话区码 - children: [], - }; - if (typeof children1[code2].children !== 'undefined') { - const children2 = children1[code2].children; - Object.keys(children2).forEach((code3) => { - city.children.push({ - label: children2[code3], - value: code3, - }); - }); - } - province.children.push(city); - }); - locationTree.push(province); +Taro.request({ + url: $hostBoot.getHost() + project.host.assetsPath + '/datas/ChinaLocations.lv4.min.json', + header: { + 'X-Requested-With': 'XMLHttpRequest', + 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', + 'Ax-Rq-Type': 'separation', + }, + credentials: 'same-origin', + dataType: 'json', + timeout: 30 * 1000, + method: 'GET', + success: response => { + locationRes = response.data; + readyCallback(); + } }); -export default { +export class ChinaLocations { + onReady(callback) { - callback(); - }, - getLocationTree() { - return locationTree; - }, + if (Tools.isEmptyObject(locationRes)) { + readyCallback = callback; + } else { + callback(); + } + } + + _createLocationTree(level) { + const treeDatas = []; + // lv1-省 + Object.keys(locationRes).forEach((provinceCode) => { + const province = { + label: locationRes[provinceCode].name, + value: provinceCode, + children: [], + }; + // lv2-市 + const cityContainer = locationRes[provinceCode].children; + Object.keys(cityContainer).forEach((cityCode) => { + const city = { + value: cityCode, + area: cityContainer[cityCode].area, // 电话区码 + children: [], + }; + if (typeof cityContainer[cityCode] === 'string') { + city.label = cityContainer[cityCode]; + } else { + city.label = cityContainer[cityCode].name; + // lv3-区 + const distContainer = cityContainer[cityCode].children || {}; + Object.keys(distContainer).forEach(distCode => { + const dist = { + value: distCode, + }; + if (typeof distContainer[distCode] === 'string') { + dist.label = distContainer[distCode]; + } else { + dist.label = distContainer[distCode].name; + // lv4-街 + if (level === 4) { + dist.children = []; + const streetContainer = distContainer[distCode].children || {}; + Object.keys(streetContainer).forEach(streetCode => { + const street = { + label: streetContainer[streetCode], + value: streetCode, + }; + dist.children.push(street); + }); + if (dist.children.length > 0) { + dist.children.unshift({ + label: '( 不选 )', + value: '', + }); + } + } + } + city.children.push(dist); + }); + } + province.children.push(city); + }); + treeDatas.push(province); + }); + return treeDatas; + } + + getLocationTree(level) { + if (level === 3) { + if (locationTreeLv3.length === 0) { + locationTreeLv3 = this._createLocationTree(3); + } + return locationTreeLv3; + } else if (level === 4) { + if (locationTreeLv4.length === 0) { + locationTreeLv4 = this._createLocationTree(4); + } + return locationTreeLv4; + } + } + // 获取省市区拼合文本 - getRegionText(regions) { + getRegionText(regions, callback) { if (regions.length === 0) { return ''; } let address = ''; - let tempLocationData = ChinaLocationData; + let tempLocationData = locationRes; regions.forEach((code) => { if (!code || !tempLocationData[code]) { address.push(''); @@ -63,9 +135,10 @@ } }); return address; - }, + } + // 省市区名称 - getRegionNames(regions) { + getRegionNames(regions, callback) { if (typeof regions === 'string') { regions = regions.split(','); } @@ -73,7 +146,7 @@ return []; } let address = []; - let tempLocationData = ChinaLocationData; + let tempLocationData = locationRes; regions.forEach((code) => { if (!code || !tempLocationData[code]) { address.push(''); @@ -88,9 +161,10 @@ } }); return address; - }, + } + // 省市区文本转code - getRegionCodes(regions) { + getRegionCodes(regions, callback) { if (typeof regions === 'string') { regions = regions.split(','); } @@ -99,12 +173,12 @@ } const codes = []; // 省 - for (let provinceCode in ChinaLocationData) { - if (ChinaLocationData.hasOwnProperty(provinceCode)) { - if (ChinaLocationData[provinceCode].name === regions[0]) { + for (let provinceCode in locationRes) { + if (locationRes.hasOwnProperty(provinceCode)) { + if (locationRes[provinceCode].name === regions[0]) { codes[0] = provinceCode; // 市 - const provinceChildren = ChinaLocationData[provinceCode].children; + const provinceChildren = locationRes[provinceCode].children; for (let cityCode in provinceChildren) { if (provinceChildren.hasOwnProperty(cityCode)) { if (provinceChildren[cityCode].name === regions[1]) { @@ -128,7 +202,8 @@ } } return codes; - }, + } + // 电话区码 getRegionsArea(regions) { if (typeof regions === 'string') { @@ -139,11 +214,11 @@ } let area = ''; // 省 - for (let provinceCode in ChinaLocationData) { - if (ChinaLocationData.hasOwnProperty(provinceCode)) { + for (let provinceCode in locationRes) { + if (locationRes.hasOwnProperty(provinceCode)) { if (provinceCode === regions[0]) { // 市 - const provinceChildren = ChinaLocationData[provinceCode].children; + const provinceChildren = locationRes[provinceCode].children; for (let cityCode in provinceChildren) { if (provinceChildren.hasOwnProperty(cityCode)) { if (cityCode === regions[1]) { @@ -157,5 +232,7 @@ } } return area; - }, -}; \ No newline at end of file + } +}; + +export const $locations = new ChinaLocations(); \ No newline at end of file -- Gitblit v1.9.1