react+taro 地区选择器和多列选择器实现省市区的三级联动

1.使用自带的地区选择器实现省市区的三级联动

微信小程序地址https://developers.weixin.qq.com/miniprogram/dev/component/picker.html
taro地址
https://taro-docs.jd.com/taro/docs/components/forms/picker/

主要代码
{/* 就业地区 */}
  {/* <View className='checkboxs1'>
          <View>
               <Text style={{color:'#E43832',fontSize:'9px'}}>*</Text>
                  <Text className='nameLab'>地区意向:</Text>
                     </View>
                        <View>                           
                           <Picker customItem={customItem} mode='region' 
                               onChange={this.bindRegionChange} value={region}  >
                           <Input value={region} className='area' placeholder='请选择就业地区'/>
                          </Picker>
                </View>
         </View> */}

// 省市区三级联动改变时的值
        bindRegionChange =  e => {
            // console.log('picker发送选择改变,携带值为', e.detail.value)
            // console.log('picker发送选择改变,携带值为', e.detail.code)
            if(e.detail.code.length == 2){
                e.detail.code.push(e.detail.code[1])
            }
            this.setState({
              region: e.detail.value,
              province_id:e.detail.code[0],
              city_id:e.detail.code[1],
              district_id:e.detail.code[2],
            })
          }
{/* 就业地区 */}

1.指定选择器类型: mode = region 省市区选择器
2.region数据格式 显示的数据,为一个数组 => region: ['北京市', '北京市', '东城区'],
3.customItem:可为每一列的顶部添加一个自定义的项 我需要的数据就是在每一个区加上 全某某市 的数据,可惜这个数据是微信官方的数据,然后这样的话在省市区的头部全都加上了一列自定义数据,而我只需要在 上加,和我需要的有一点区别

2.使用多列选择器实现省市区的联动,写的很杂,因为第一次写,写的非常垃圾

实现的效果
主要代码
 {/* 就业地区 */}
          <View className='checkboxs1'>
                <View>
                     <Text style={{color:'#E43832',fontSize:'9px'}}>*</Text>
                           <Text className='nameLab'>地区意向:</Text>
                                </View>
                                <View>                                                   
                                    <Picker mode='multiSelector' range={this.state.selector} value={areaValue} onChange={this.onChange}  onColumnChange={this.onColumnChange} >
                                    <Text className='area' >{areaName}</Text>
                             </Picker>  
                      </View>
              </View>

1.指定选择器类型 mode='multiSelector'

2.range:为多列选择器的数据,二维数组,格式
省市区三列,三个数组
3.value:表示选择了 range 中的第几个(下标从 0 开始)

4.onChange:当 value 改变时触发 change 事件,event.detail = {value};onColumnChange:列改变时触发

主要的代码就是下面这个

            areaValue:[0,0,0], // 在selector里面的下标
            selector: [], // 省市区的数组数据 里面是省市区的三个数组
 // 初始化地区数据
        initArea = () => {
            let { regionData, selector, areaValue,provinceArr,cityArr,districtArr,areaName} = this.state
            let province = []
            let city = []
            let district =[]
            regionData.forEach(item => {
                province.push(item.label)
            })
            selector.push(province)
            regionData[0].children.forEach(item => {
                city.push(item.label)
                item.children.forEach(child => {
                    district.push(child.label)
                })
            })
            selector.push(city)
            selector.push(district)
            let name = `${selector[0][0]},${selector[1][0]},${selector[2][0]}`
            this.setState({
                selector,
                provinceArr: province,
                cityArr: city,
                districtArr: district,
                areaName:'请选择你的就业地区 >'
            })
        }
 //   列改变
        onColumnChange = e => {
          let { regionData, selector,provinceArr,cityArr,districtArr,areaValue,provinceIndex,cityIndex,districtIndex,rangeKey } = this.state
          let column = e.detail.column
          let index = e.detail.value
        //   this.initArea()
         //修改的列为 0 ,值为 1,第一列索引为 1 的值改变了,索引从0开始
          console.log('修改的列为', e.detail.column, ',值为', e.detail.value);
          if(column == 0 ){
                let arr = []
                let arrchild = []
                let provinceIndex = index // 保存一下省份index
                let cityList = regionData[index].children  // 城市名字
                cityList.forEach(city => {
                    arr.push(city.label)
                })
                
                cityList[0].children.forEach(district => {
                    arrchild.push(district.label)
                })
                this.setState({
                    cityArr:arr,
                    provinceIndex,
                    selector:[provinceArr,arr,arrchild],
                    areaValue:[provinceIndex,0,0],
                })
                // console.log(`省份移动${areaValue}`)
          }else if(column == 1){
                let cityIndex = index
                let districtArr = []
                // let cityName = cityArr[index]  // 拿到当前选择的 城市名字
                let arr = []
                // let provIndex = provinceIndex == '' ? areaValue[0] : provinceIndex
                regionData[areaValue[0]].children.forEach(item =>{ // 这一步是为了回显的时候,如果用户没有移动省份,直接移动市的时候,依然能够得到正确的数据,因为 areaValue[0] 数据是省的下标, regionData[areaValue[0]].children就是 原始数据里对应的省份下的市的数据
                    arr.push(item.label)
                })
                let cityName = arr[index]
                regionData[areaValue[0]].children.forEach(city => {
                    if(city.label == cityName){
                        city.children.forEach(district => {
                            districtArr.push(district.label)
                        })
                    }
                })
                // console.log(districtArr)
                this.setState({
                    cityIndex,
                    districtArr,
                    selector:[provinceArr,arr,districtArr],
                    areaValue:[areaValue[0],index,0],
                })
                // console.log(`市移动${areaValue}`)
          }else{
                let districtIndex = index
                provinceIndex = areaValue[0] == '' ? 0 : areaValue[0]
                cityIndex = areaValue[1] == '' ? 0 : cityIndex
                this.setState({
                    areaValue:[provinceIndex,cityIndex,index],
                })
                // console.log(`区移动${areaValue}`)
          }
        }
        // 确定后的数据 onChange  [8, 0, 0] 对应选择数据的下标
        onChange = e => {
            let { selector,areaValue, areaName,province_id,city_id,district_id } = this.state
            const [pro,cty,dis] = e.detail.value // 结构数组中的数据
            let proName = selector[0][pro]
            let ctyName = selector[1][cty]
            let disName = selector[2][dis]
            console.log('onChange', e.detail.value)
            let proCode =  this.searchProCode(proName)
            let ctyCode =  this.searchCtyCode(ctyName)
            let disCode =  this.searchDisCode(disName)
            let name = `${proName},${ctyName},${disName}`
            this.setState({
                areaName:name,
                province_id:proCode,
                city_id:ctyCode,
                district_id:disCode
            })
        }  

主要实现思路:1. 每一列改变的时候可以得到这一列改变的列数和这一列改变的索引,判断是第几列改变,拿到这一列改变的索引区原数据中得到省份下的市,再拿到区
2.第一列数据是固定的省份数组,通过索引去原数据中找到对应省份下 改变的市,然后再通过市去得到区
3第一列 省改变,得到市,第二列改变得到区,保存一下这个改变的index,通过 index 去 range 里面通过索引得到展示的数据,

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容