From f969b32736ab60b141d076f7aeaafdbd9dc1c546 Mon Sep 17 00:00:00 2001 From: Tevin <tingquanren@163.com> Date: Thu, 08 Apr 2021 16:36:18 +0800 Subject: [PATCH] 调整地址三级联动api,在小程序中将地址数据分离为外置的静态文件 --- forms/chinaArea/ChinaLocations.js | 8 ++ forms/chinaArea/ChinaLocations.weapp.js | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++ forms/chinaArea/CChinaArea.vue | 9 ++ 3 files changed, 166 insertions(+), 3 deletions(-) diff --git a/forms/chinaArea/CChinaArea.vue b/forms/chinaArea/CChinaArea.vue index 59e0e7d..0b00296 100644 --- a/forms/chinaArea/CChinaArea.vue +++ b/forms/chinaArea/CChinaArea.vue @@ -35,7 +35,7 @@ import ChinaLocations from './ChinaLocations'; import './cChinaArea.scss'; -const { locationTree, getRegionNames } = ChinaLocations; +const { onReady, getLocationTree, getRegionNames } = ChinaLocations; export default { name: 'CChinaArea', @@ -79,6 +79,7 @@ return; } } + const locationTree = getLocationTree(); const curVal = this.itemRes.formData[this.itemRes.name]; const range = [ locationTree, @@ -123,6 +124,7 @@ this.current = current; }, updateColumns(roll) { + const locationTree = getLocationTree(); // 第一列滚动 if (roll.column === 0) { const cities = locationTree[roll.value].children; @@ -141,6 +143,7 @@ } }, handleChange(detail) { + const locationTree = getLocationTree(); const codes = []; const provice = locationTree[detail[0]]; codes[0] = provice.value; @@ -153,7 +156,9 @@ }, mounted() { if (process.env.TARO_ENV === 'weapp') { - this.handleOpen(); + onReady(() => { + this.handleOpen(); + }); } }, }; diff --git a/forms/chinaArea/ChinaLocations.js b/forms/chinaArea/ChinaLocations.js index 3710d30..c5e6b98 100644 --- a/forms/chinaArea/ChinaLocations.js +++ b/forms/chinaArea/ChinaLocations.js @@ -6,6 +6,7 @@ import ChinaLocationData from './ChinaLocationData.json'; const locationTree = []; + Object.keys(ChinaLocationData).forEach((code1) => { const province = { label: ChinaLocationData[code1].name, @@ -34,7 +35,12 @@ }); export default { - locationTree, + onReady(callback) { + callback(); + }, + getLocationTree() { + return locationTree; + }, // 获取省市区拼合文本 getRegionText(regions) { if (regions.length === 0) { diff --git a/forms/chinaArea/ChinaLocations.weapp.js b/forms/chinaArea/ChinaLocations.weapp.js new file mode 100644 index 0000000..b6b3e04 --- /dev/null +++ b/forms/chinaArea/ChinaLocations.weapp.js @@ -0,0 +1,152 @@ +/** + * ChinaLocations + * @author Tevin + */ + +import Taro from '@tarojs/taro'; +import { Fetcher } from '@components/bases/Fetcher'; +import project from '@project'; + +const locationTree = []; +let ChinaLocationData = {}; +let readyCallback = () => { }; + +Taro.request({ + url: Fetcher.host + project.host.assetsPath + '/datas/ChinaLocation.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 => { + ChinaLocationData = response.data; + 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, + 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); + }); + readyCallback(); + } +}); + +export default { + onReady(callback) { + if (ChinaLocationData.length > 0) { + callback(); + } else { + readyCallback = callback; + } + }, + getLocationTree() { + return locationTree; + }, + // 获取省市区拼合文本 + getRegionText(regions, callback) { + if (regions.length === 0) { + return ''; + } + let address = ''; + let tempLocationData = ChinaLocationData; + regions.forEach((code) => { + if (typeof tempLocationData[code].name === 'string') { + address += tempLocationData[code].name; + } else { + address += tempLocationData[code]; + } + tempLocationData = tempLocationData[code].children; + }); + return address; + }, + // 省市区名称 + getRegionNames(regions, callback) { + + if (typeof regions === 'string') { + regions = regions.split(','); + } + if (!regions || regions.length === 0 || !regions[0]) { + return []; + } + let address = []; + let tempLocationData = ChinaLocationData; + regions.forEach((code) => { + if (!tempLocationData[code]) { + return; + } + if (typeof tempLocationData[code].name === 'string') { + address.push(tempLocationData[code].name); + } else { + address.push(tempLocationData[code]); + } + tempLocationData = tempLocationData[code].children; + }); + return address; + + }, + // 省市区文本转code + getRegionCodes(regions, callback) { + + if (typeof regions === 'string') { + regions = regions.split(','); + } + if (!regions || regions.length === 0 || !regions[0]) { + return ''; + } + const codes = []; + // 省 + for (let provinceCode in ChinaLocationData) { + if (ChinaLocationData.hasOwnProperty(provinceCode)) { + if (ChinaLocationData[provinceCode].name === regions[0]) { + codes[0] = provinceCode; + // 市 + const provinceChildren = ChinaLocationData[provinceCode].children; + for (let cityCode in provinceChildren) { + if (provinceChildren.hasOwnProperty(cityCode)) { + if (provinceChildren[cityCode].name === regions[1]) { + codes[1] = cityCode; + // 区 + const areaChildren = provinceChildren[cityCode].children; + for (let areaCode in areaChildren) { + if (areaChildren.hasOwnProperty(areaCode)) { + if (areaChildren[areaCode] === regions[2]) { + codes[2] = areaCode; + break; + } + } + } + break; + } + } + } + break; + } + } + } + return codes; + + }, +}; \ No newline at end of file -- Gitblit v1.9.1