react+taro实现省县区三级联动
Posted 丰柏林
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了react+taro实现省县区三级联动相关的知识,希望对你有一定的参考价值。
案例在React.FC中实现。
视图代码
import Taro from "@tarojs/taro";
import {View, Picker} from "@tarojs/components";
import {AtList, AtListItem, AtTextarea} from "taro-ui";
import React, {useEffect, useState} from "react";
import addressData from "./addressData";
const selectorAddress = addressData
const PostInformationContainer: React.FC = () => {
const [address, setAddress] = useState('请选择地址')
//三级联动
const [customArray, setCustomArray] = useState(selectorAddress)
const [customIndex, setCustomIndex] = useState([0, 0, 0])
let [onlyArray, setOnlyArray] = useState([[], [], []])
useEffect(() => {
const data = {
customArray: customArray,
customIndex: customIndex,
onlyArray: onlyArray,
};
for (let i = 0; i < data.customArray.length; i++) {
// @ts-ignore
data.onlyArray[0].push(customArray[i].name);
}
for (let j = 0; j < data.customArray[customIndex[0]].cityList.length; j++) {
// @ts-ignore
data.onlyArray[1].push(customArray[customIndex[0]].cityList[j].name);
}
for (let k = 0; k < customArray[customIndex[0]].cityList[customIndex[1]].areaList.length; k++) {
// @ts-ignore
data.onlyArray[2].push(customArray[customIndex[0]].cityList[customIndex[1]].areaList[k]);
}
setCustomArray(data.customArray)
setCustomIndex(data.customIndex)
setOnlyArray(data.onlyArray)
})
//多列选择
const bindCustomPickerColumnChange = (e) => {
const newCustomArray = selectorAddress
const newCustomIndex = customIndex
const newOnlyArray = onlyArray
newCustomIndex[e.detail.column] = e.detail.value;
// console.log(e.detail)
// console.log(onlyArray);
const searchColumn = () => {
for (let i = 0; i < newCustomArray.length; i++) {
let arr1 = [];
let arr2 = [];
if (i == newCustomIndex[0]) {
for (let j = 0; j < newCustomArray[i].cityList.length; j++) {
// @ts-ignore
arr1.push(newCustomArray[i].cityList[j].name);
if (j == newCustomIndex[1]) {
for (let k = 0; k < newCustomArray[i].cityList[j].areaList.length; k++) {
// @ts-ignore
arr2.push(newCustomArray[i].cityList[j].areaList[k]);
}
newOnlyArray[2] = arr2;
}
}
newOnlyArray[1] = arr1;
}
};
}
switch (e.detail.column) {
case 0:
newCustomIndex[1] = 0;
newCustomIndex[2] = 0;
searchColumn();
break;
case 1:
newCustomIndex[2] = 0;
searchColumn();
break;
}
//这里要清空原来的数据进行数据更新
setOnlyArray([[],[],[]])
setCustomIndex(newCustomIndex)
}
//选择地区
const addressOnChange = (e) => {
const indexArr = e.detail.value
// console.log(customArray[indexArr[0]].cityList[indexArr[1]].areaList[indexArr[2]])
const addressText = `${customArray[indexArr[0]].name}${customArray[indexArr[0]].cityList[indexArr[1]].areaList[indexArr[2]]}`
setAddress(addressText)
}
return (
<View className='information-pages'>
{/*选择地址 这里要自己写三级联动*/}
<Picker mode='multiSelector' range={onlyArray} onChange={addressOnChange} value={customIndex} onColumnChange={bindCustomPickerColumnChange.bind(this)}>
<AtList>
<AtListItem
title='选择地址'
extraText={address}
>
</AtListItem>
</AtList>
</Picker>
</View>
)
}
export default PostInformationContainer
数据献上
const addressData = [
{name:'上海',
cityList:[
{name:'市辖区',
areaList:['黄浦区','卢湾区','徐汇区','长宁区','静安区','普陀区','闸北区','虹口区','杨浦区','闵行区','宝山区','嘉定区','浦东新区','金山区','松江区','青浦区','南汇区','奉贤区']},
{name:'县',
areaList:['崇明县']},
],
},
{name:'北京', cityList:[
{name:'市辖区', areaList:['东城区','西城区','崇文区','宣武区','朝阳区','丰台区','石景山区','海淀区','门头沟区','房山区','通州区','顺义区','昌平区','大兴区','怀柔区','平谷区']},
{name:'县', areaList:['密云县','延庆县']}
]},
{name:'天津', cityList:[
{name:'市辖区', areaList:['和平区','河东区','河西区','南开区','河北区','红桥区','塘沽区','汉沽区','大港区','东丽区','西青区','津南区','北辰区','武清区','宝坻区']},
{name:'县', areaList:['宁河县','静海县','蓟 县']}
]},
{name:'重庆', cityList:[
{name:'市辖区', areaList:['万州区','涪陵区','渝中区','大渡口区','江北区','沙坪坝区','九龙坡区','南岸区','北碚区','万盛区','双桥区','渝北区','巴南区','黔江区','长寿区']},
{name:'县', areaList:['綦江县','潼南县','铜梁县','大足县','荣昌县','璧山县','梁平县','城口县','丰都县','垫江县','武隆县','忠 县','开 县','云阳县','奉节县','巫山县','巫溪县','石柱土家族自治县','秀山土家族苗族自治县','酉阳土家族苗族自治县','彭水苗族土家族自治县']},
{name:'市', areaList:['江津市','合川市','永川市','南川市']}
]},
{name:'四川', cityList:[
{name:'成都市', areaList:['市辖区','锦江区','青羊区','金牛区','武侯区','成华区','龙泉驿区','青白江区','新都区','温江县','金堂县','双流县','郫 县','大邑县','蒲江县','新津县','都江堰市','彭州市','邛崃市','崇州市']},
{name:'自贡市', areaList:['市辖区','自流井区','贡井区','大安区','沿滩区','荣 县','富顺县']},
{name:'攀枝花市', areaList:['市辖区','东 区','西 区','仁和区','米易县','盐边县']},
{name:'泸州市', areaList:['市辖区','江阳区','纳溪区','龙马潭区','泸 县','合江县','叙永县','古蔺县']},
{name:'德阳市', areaList:['市辖区','旌阳区','中江县','罗江县','广汉市','什邡市','绵竹市']},
{name:'绵阳市', areaList:['市辖区','涪城区','游仙区','三台县','盐亭县','安 县','梓潼县','北川羌族自治县','平武县','江油市']},
{name:'广元市', areaList:['市辖区','市中区','元坝区','朝天区','旺苍县','青川县','剑阁县','苍溪县']},
{name:'遂宁市', areaList:['市辖区','船山区','安居区','蓬溪县','射洪县','大英县']},
{name:'内江市', areaList:['市辖区','市中区','东兴区','威远县','资中县','隆昌县']},
{name:'乐山市', areaList:['市辖区','市中区','沙湾区','五通桥区','金口河区','犍为县','井研县','夹江县','沐川县','峨边彝族自治县','马边彝族自治县','峨眉山市']},
{name:'南充市', areaList:['市辖区','顺庆区','高坪区','嘉陵区','南部县','营山县','蓬安县','仪陇县','西充县','阆中市']},
{name:'眉山市', areaList:['市辖区','东坡区','仁寿县','彭山县','洪雅县','丹棱县','青神县']},
{name:'宜宾市', areaList:['市辖区','翠屏区','宜宾县','南溪县','江安县','长宁县','高 县','珙 县','筠连县','兴文县','屏山县']},
{name:'广安市', areaList:['市辖区','广安区','岳池县','武胜县','邻水县','华莹市']},
{name:'达州市', areaList:['市辖区','通川区','达 县','宣汉县','开江县','大竹县','渠 县','万源市']},
{name:'雅安市', areaList:['市辖区','雨城区','名山县','荥经县','汉源县','石棉县','天全县','芦山县','宝兴县']},
{name:'巴中市', areaList:['市辖区','巴州区','通江县','南江县','平昌县']},
{name:'资阳市', areaList:['市辖区','雁江区','安岳县','乐至县','简阳市']},
{name:'阿坝藏族羌族自治州', areaList:['汶川县','理 县','茂 县','松潘县','九寨沟县','金川县','小金县','黑水县','马尔康县','壤塘县','阿坝县','若尔盖县','红原县']},
{name:'甘孜藏族自治州', areaList:['康定县','泸定县','丹巴县','九龙县','雅江县','道孚县','炉霍县','甘孜县','新龙县','德格县','白玉县','石渠县','色达县','理塘县','巴塘县','乡城县','稻城县','得荣县']},
{name:'凉山彝族自治州', areaList:['西昌市','木里藏族自治县','盐源县','德昌县','会理县','会东县','宁南县','普格县','布拖县','金阳县','昭觉县','喜德县','冕宁县','越西县','甘洛县','美姑县'react+taro实现省县区三级联动