react省市二级联动

class Province extends Component {
  constructor(props) {
    super(props)
  }
  handleChange(e) {
    this
      .props
      .parentAction(e.target.value)
  }

  render() {
    return (
      <select onChange={this
        .handleChange
        .bind(this)}>
        {this
          .props
          .value
          .map((item, key) => (
            <option value={item.zhou}>{item.zhou}</option>
          ))}
      </select>
    )
  }
}

//城市选择框
class City extends Component {
  render() {
    return (
      <select>
        {this
          .props
          .value
          .map(item => <option value={item}>{item}</option>)}
      </select>
    )
  }
}

class Picker extends Component {
  constructor(props) {
    super(props)
    this.state = {
      province: [
        {
          id: 1,
          zhou: "江苏",
          country: ["南京", "苏州", "无锡"]
        }, {
          id: 2,
          zhou: "安徽",
          country: ["合肥", "芜湖"]
        }
      ],
      isProvince: "江苏",
      isCity: ''
    }
  }

  handleParentAction(value) {
    this.setState({isProvince: value})
  }

  render() {
    return (
      <div>
        <Province
          value={this.state.province}
          parentAction={this
          .handleParentAction
          .bind(this)}/>
        <City
          value={this
          .state
          .province
          .find((item) => {
            return (item.zhou == this.state.isProvince)
          })
          .country}/>
      </div>
    )
  }
}

基于react的省份和市的二级联动,处理数据替换父组件中的province即可
注意点是: isPrivince这个state一定要设置成默认选中的那个省

改进版本

class ProvinceCity extends Component {
  constructor(props) {
    super(props)
    this.state = {
      priciList: [
        {
          id: 0,
          province: '请选择省份',
          cities: ['请选择城市']
        }, {
          id: 1,
          province: '安徽',
          cities: ['芜湖', '合肥']
        }
      ],
      provinceSelected: '请选择省份',
      citySelected: ''
    }
  }

  handleProvinceChange(e) {
    this.setState({provinceSelected: e.target.value})

  }

  handleCityChange(e) {
    this.setState({citySelected: e.target.value})
  }
  handleProvinceBlur(e) {
    this
      .props
      .parentAction({province: e.target.value})
  }

  handleCityBlur(e) {
    this
      .props
      .parentAction({city: e.target.value})
  }

  render() {
    return (
      <div>
        <select
          onChange={this
          .handleProvinceChange
          .bind(this)}
          onBlur={this
          .handleProvinceBlur
          .bind(this)}>
          {this
            .state
            .priciList
            .map((item, key) => (
              <option value={item.province} key={key}>{item.province}</option>
            ))}
        </select>
        <select
          onChange={this
          .handleCityChange
          .bind(this)}
          onBlur={this
          .handleCityBlur
          .bind(this)}>
          {this
            .state
            .priciList
            .find((item, key) => (item.province == this.state.provinceSelected))
            .cities
            .map((item, key) => (
              <option value={item} key={key}>{item}</option>
            ))}
        </select>
      </div>
    )
  }
}

class Parent extends Component {
  constructor(props) {
    super(props)
    this.state = {
      province: '',
      city: ''
    }
  }

  handleParentAction(value) {
    value.city
      ? this.setState({city: value.city})
      : this.setState({province: value.province})
  }

  handleClick() {
    console.log(this.state.province, this.state.city)
  }
  render() {
    return (
      <div>
        <ProvinceCity
          parentAction={this
          .handleParentAction
          .bind(this)}/>
        <input value="点击"
          type="button"
          onClick={this
          .handleClick
          .bind(this)}/>
      </div>
    )
  }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的React实现四级联动的例子: ```jsx import React, { useState } from "react"; const options = { "浙江省": { "杭州市": { "西湖区": ["西湖街道", "灵隐街道"], "上城区": ["中山北路街道", "南星街道"] }, "宁波市": { "海曙区": ["中山东路街道", "白云街道"], "江东区": ["庄桥街道", "七塘街道"] } }, "江苏省": { "南京市": { "玄武区": ["梅园新村街道", "红山街道"], "秦淮区": ["夫子庙街道", "集庆门街道"] }, "苏州市": { "姑苏区": ["虎丘街道", "石路街道"], "吴中区": ["香山街道", "越溪街道"] } } }; function Cascader() { const [province, setProvince] = useState("浙江省"); const [city, setCity] = useState("杭州市"); const [district, setDistrict] = useState("西湖区"); const [street, setStreet] = useState("西湖街道"); const handleProvinceChange = (e) => { setProvince(e.target.value); setCity(Object.keys(options[e.target.value])[0]); setDistrict(Object.keys(options[e.target.value][Object.keys(options[e.target.value])[0]])[0]); setStreet(options[e.target.value][Object.keys(options[e.target.value])[0]][Object.keys(options[e.target.value][Object.keys(options[e.target.value])[0]])[0]][0]); }; const handleCityChange = (e) => { setCity(e.target.value); setDistrict(Object.keys(options[province][e.target.value])[0]); setStreet(options[province][e.target.value][Object.keys(options[province][e.target.value])[0]][0]); }; const handleDistrictChange = (e) => { setDistrict(e.target.value); setStreet(options[province][city][e.target.value][0]); }; const handleStreetChange = (e) => { setStreet(e.target.value); }; return ( <div> <select value={province} onChange={handleProvinceChange}> {Object.keys(options).map((option) => ( <option key={option} value={option}> {option} </option> ))} </select> <select value={city} onChange={handleCityChange}> {Object.keys(options[province]).map((option) => ( <option key={option} value={option}> {option} </option> ))} </select> <select value={district} onChange={handleDistrictChange}> {Object.keys(options[province][city]).map((option) => ( <option key={option} value={option}> {option} </option> ))} </select> <select value={street} onChange={handleStreetChange}> {options[province][city][district].map((option) => ( <option key={option} value={option}> {option} </option> ))} </select> </div> ); } export default Cascader; ``` 在这个例子中,我们使用了`useState`来管理四个状态:`province`、`city`、`district`和`street`,分别代表省、市、区和街道。我们通过`select`元素来实现四级联动,每一级的选项都是根据上一级的选项来动态生成的。 当省份选项发生改变时,我们需要根据选中的省份来动态生成城市选项,同时也需要把城市、区和街道的选项重置为默认值。当城市选项发生改变时,我们需要根据选中的城市来动态生成区选项,并重置街道选项为默认值。当区选项发生改变时,我们需要根据选中的区来动态生成街道选项。当街道选项发生改变时,我们只需要更新`street`状态的值即可。 上述代码只是一个简单的例子,实际情况下可能会更加复杂。但是原理是相同的:通过状态来实现四级联动,根据当前选中的选项来动态生成下一级选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值