思路:

数据设计:省份为一维数组,一级市为二维数组,二级市/区/县为三维数组。这样设计的好处在于根据数组索引实现数据的关联。

UI组件: MUI的DropDownMenu组件或Select Field组件。将省市县数据定位常量,在UI组件里引用,通过数组遍历。

数据设计代码:(鉴于数据比较多,只列举部分)

provinceData.js

/********** 省级数据 **********/
export const provinces =['安徽省','澳门特别行政区','北京'];
/********** 市级数据 **********/
export const cities = [
['合肥市','芜湖市','蚌埠市','淮南市','马鞍山市','淮北市','铜陵市','安庆市','黄山市','滁州市','阜阳市','宿州市','六安市','亳州市','池州市','宣城市'],
['澳门半岛', '离岛'],
['北京市'],
];
/********** 市二级数据 **********/
export const counties =
[
[
['瑶海区','庐阳区','蜀山区','包河区','长丰县','肥东县','肥西县','庐江县','其它区','巢湖市'],
['镜湖区','戈江区','鸠江区','三山区','芜湖县','繁昌县','南陵县','无为县','其它区'],
['龙子湖区','蚌山区','禹会区','淮上区','怀远区','五河县','固镇县','其它区'],
['大通区','田家庵区','谢家集区','八公山区','潘集区','凤台县','寿县','其它区'],
['花山区','雨山区','博望区','当涂县','含山县','和县','其它区'],
['杜集区','相山区','烈山区','濉溪县','其它区'],
['铜官区','郊区','义安区','枞阳县','其它区'],
['迎江区','大观区','宜秀区','怀宁县','潜山县','太湖县','宿松县','望江县','岳西县','桐城市','其它区'],
['屯溪区','黄山区','徽州区','歙县','休宁县','祁门县','其它区'],
['琅琊区','南谯区','来安息','全椒县','定远县','凤阳县','天长市','明光市','其它区'],
['颍州区','颍东区','临泉县','太和县','阜南县','颍上县','界首市','其它区'],
['埇桥区','砀山县','萧县','灵璧县','泗县','其它区'],
['金安区','裕安区','叶集区','霍邱县','舒城县','金寨县','霍山县','其它区'],
['谯城区','涡阳区','蒙城区','利辛县','其它区'],
['贵池区','东至县','石台县','青阳县','其它区'],
['宣州区','郎溪县','广德县','泾县','绩溪县','旌德县','宁国市','其它区']
],
[
['澳门']
],
[
['东城区','西城区','朝阳区','丰台区','石景山区','海淀区','门头沟区','房山区','通州区','顺义区','昌平区','大兴区','怀柔区','平谷区','密云县','延庆县','其它区'],
],
]
 
React组件代码:
 
ProvinceSelect.jsx
 
import React from 'react';
import DropDownMenu from 'material-ui/DropDownMenu';
import MenuItem from 'material-ui/MenuItem';
import { provinces, cities, counties } from './provinceData';
class ProvinceSelect extends React.PureComponent {
    constructor(props) {
         super(props);
         this.state = {
            provinceValue: '安徽省',
            provinceIndex: 0,
            cityValue: '合肥市',
            cityIndex: 0,
            countyValue: '瑶海区',
            countyIndex: 0,
        };
    }
 
    handleChangeProvince = (event, index, value) =>
        this.setState({
          provinceIndex: index,
          provinceValue: value,
          cityValue: cities[index][0],
          countyValue: counties[index][0][0],
       });
    handleChangeCity = (event, index, value) =>
        this.setState({
          cityIndex: index,
          cityValue: value,
          countyValue: counties[this.state.provinceIndex][index][0],
    });
    handleChangeCounty = (event, index, value) => this.setState({ countyIndex: index, countyValue: value });
    render() {
        const { provinceValue, provinceIndex, cityValue, cityIndex, countyValue } = this.state;
        return (
          <div>
            <DropDownMenu value={provinceValue} onChange={this.handleChangeProvince}>
                {provinces.map((item, index) => (
                <MenuItem key={`province${index}`} value={item} primaryText={item} />
              ))}
           </DropDownMenu>
          <DropDownMenu value={cityValue} onChange={this.handleChangeCity}>
              {cities[provinceIndex].map((item, index) => (
                <MenuItem key={`city${index}`} value={item} primaryText={item} />
            ))}
         </DropDownMenu>
        <DropDownMenu value={countyValue} onChange={this.handleChangeCounty}>
          {counties[provinceIndex][cityIndex].map((item, index) => (
            <MenuItem key={`county${index}`} value={item} primaryText={item} />
        ))}
      </DropDownMenu>
    </div>
      );
    }
}
export default ProvinceSelect;

封装react组件——三级联动的更多相关文章

  1. React 省市区三级联动

    省市区所对应的数据来自:http://www.zgguan.com/zsfx/jsjc/6541.html react中的代码是: export default class AddReceive ex ...

  2. js封装的三级联动菜单(使用时只需要一行js代码)

    前言 在实际的项目开发中,我们经常需要三级联动,比如省市区的选择,商品的三级分类的选择等等. 而网上却找不到一个代码完整.功能强大.使用简单的三级联动菜单,大都只是简单的讲了一下实现思路. 下面就给大 ...

  3. react初探(二)之父子组件通信、封装公共组件

    一.前言 在组件方面react和Vue一样的,核心思想玩的就是组件,下面举两个组件常用的情景. 场景一:假如我们现在有一个页面包含表格以及多个弹框,这种时候如果将这个页面的业务代码写在一个组件中,那么 ...

  4. 用mint-ui picker组件 实现省市区三级联动

    公司上一期项目中新增了省市区滑动三级联动效果,用的是mint-ui的picker组件和popup组件,效果如下:点击确定换地区,点击取消不变 省市区数据是后台给的(根据上一级的id,获取下一级数据列表 ...

  5. vue仿京东省市区三级联动选择组件

    工作中需要一个盒京东购物车地址选择相似的一个省市区三级联动选择组件,google查了下都是下拉框形式的,于是自己写了一个,希望对使用vue开发项目的朋友有帮助,显示效果如下:使用vue2.0开发 ht ...

  6. 1:MUI选择器组件抛出“n.getSelectedItem is not a function”异常的解决办法 2:mui三级联动 3:移动端关闭虚拟键盘

    1:如下图 问题:引用了mui的地址选择的三级联动的应用在h5上的组件 百度发现别人思路对 Array 原型链方法扩充时,会抛出这个异常. 修改方法: mui.poppicker.js 第 112 行 ...

  7. vue移动端地址三级联动组件(一)

    vue移动端地区三级联动 省,市,县.用的vue+mintUi 因为多级联动以及地区的规则比较多.正好有时间自己写了一个.有问题以及建议欢迎指出.涉及到dom移动,所以依赖vue+jquery.这边数 ...

  8. 城市三级联动 AJAX-原生js封装

    话不多说我们先来一张效果图给大家看一下: html代码如下: <!DOCTYPE html><html lang="en"><head> < ...

  9. 封装react antd的表格table组件

    封装组件是为了能在开发过程中高度复用功能和样式相似的组件,以便我们只关注于业务逻辑层的处理,提高开发效率,提高逼格,降低代码重复率,降低劳动时间,减少加班的可能. 本次组件的封装采用了函数式组件即无状 ...

随机推荐

  1. 由Handle转换为控件

    Control c = Control.FromHandle(this.textBox1.Handle); TextBox f = c as TextBox;

  2. JavaWeb基础—Tomcat

    JavaWeb服务器:可以运行以及发布JavaWeb应用的JavaWeb容器,开发项目必须放在该容器中才可以被浏览器访问.(只能等待请求,然后做出响应) 静态资源(HTML):数据始终不变 动态资源( ...

  3. 20155333 实现mypwd

    20155333 实现mypwd 学习pwd命令 Linux中用 pwd 命令来查看"当前工作目录"的完整路径. 命令格式:pwd [选项] 命令功能:查看"当前工作目录 ...

  4. python基础学习1-json,pickle的序列化和反序列化

    import requests import json dic={'k1':'v1'} print(dic,type(dic)) result = json.dumps(dic)#调用dumps方法把 ...

  5. 「PKUSC2018」真实排名

    题面 题解 因为操作为将一些数字翻倍, 所以对于一个数\(x\), 能影响它的排名的的只有满足\(2y\geq x\)或\(2x>y\)的\(y\) 将选手的成绩排序,然后考虑当前点的方案 1. ...

  6. 1433: [ZJOI2009]假期的宿舍

    1433: [ZJOI2009]假期的宿舍 链接 分析: 直接网络流,看是否满足即可. S向每个有需要的人连边,有床的向T连边,认识的人之间互相连边. 代码: #include<cstdio&g ...

  7. thymeleaf多条件判断

    解决办法:将逻辑关系全部写到大括号里面 <div th:if="${task.getStatusStr() !='已延期' ||task.getStatusStr()!='已完成'}& ...

  8. 菜鸟vimer成长记——第4.1章、通用插件

    简介 关于插件的分类,此系列只会简单的区分为通用插件和编程插件.通用插件的意思是,不基于任何编程语言都可以使用的插件.编程插件,是针对于编程习惯,或者说是针对于某种语言的插件. 计划中,是先把基本常用 ...

  9. 第四节:Windows系统安装时BIOS设置及注意

    BIOS系统 BIOS是英文"Basic Input Output System"的缩略词,直译过来后中文名称就是"基本输入输出系统".在IBM PC兼容系统上 ...

  10. TensorFlow Python3.7环境下的源码编译(三)编译

    这里要为仅支持 CPU 的 TensorFlow 构建一个 pip 软件包,需要调用以下命令: $ bazel build --cxxopt="-D_GLIBCXX_USE_CXX11_AB ...