省市区三级联动taro多列选择器

本文介绍了一个使用TaroJS实现的地区选择器组件,该组件允许用户从省市区列表中选择地址,通过监听columnChange事件更新省市县数据,并在picker组件中显示。文章详细展示了组件的状态管理、数据绑定及事件处理过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import Taro, { Component, Config } from '@tarojs/taro'
import { View, Picker } from '@tarojs/components'
import './index.scss'
import address from '../../utils/city'

export default class Index extends Component {
  state = {
    province: '',
    city: '',
    area: '',
    pickerShow: false,
    value: [0, 0, 0],
    provinces: address.provinces,
    citys: address.citys[110000],
    areas: address.areas[110100],
    ranges: [[], [], []],
  }

  componentDidShow() {
    this.cityChange()
  }

  columnChange(e) {
    const { provinces, citys, value } = this.state
    const column = e.detail.column
    const evalue = e.detail.value
    let provinceNum = value[0]
    let cityNum = value[1]
    let countyNum = value[2]
    if (column == 0) {
      provinceNum = evalue
      const id = provinces[provinceNum].id
      this.setState({
        value: [provinceNum, 0, 0],
        citys: address.citys[id],
        areas: address.areas[address.citys[id][0].id]
      }, () => {
        this.cityChange()
      })
    } else if (column == 1) {
      cityNum = evalue
      const id = citys[cityNum].id
      // console.log(id)
      this.setState({
        value: [provinceNum, cityNum, 0],
        areas: address.areas[citys[cityNum].id]
      }, () => {
        this.cityChange()
      })
    } else {
      // 滑动选择了区
      countyNum = evalue
      this.setState({
        value: [provinceNum, cityNum, countyNum]
      }, () => {
        this.cityChange()
      })
    }
  }
  cityChange() {
    const { provinces, citys, areas } = this.state
    let ranges = [[], [], []]
    for (let i = 0; i < provinces.length; i++) {
      ranges[0].push(provinces[i].name)
    }
    for (let i = 0; i < citys.length; i++) {
      ranges[1].push(citys[i].name)
    }
    for (let i = 0; i < areas.length; i++) {
      ranges[2].push(areas[i].name)
    }
    this.setState({
      ranges: ranges,
    })
  }
  //  params true代表传递地址,false不传递
  handlePickerShow(params: boolean, e) {
    // console.log('params', params)
    if (params) {
      const { provinces, citys, areas, value } = this.state
      const p = provinces[value[0]].name
      const c = citys[value[1]].name
      const a = areas[value[2]].name
      this.setState({
        pickerShow: !this.state.pickerShow,
        province: p || '',
        city: c || '',
        area: a || '',
      })
    }
  }

  render() {
    return (
      <View>
        <Picker mode='multiSelector' range={this.state.ranges} onChange={this.handlePickerShow.bind(this)} onColumnChange={this.columnChange.bind(this)}>
          <View>
            {this.state.province && <View>{this.state.province} {this.state.city} {this.state.area}</View>}
            {!this.state.province && <View>请选择地区</View>}
          </View>
        </Picker>
      </View>
    )
  }
}

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值