react结合antd的Cascader组件实现pc端选择城市控件

业务需求,网上找了好多,发现都不太满意,于是自己写了一个

1.实现如下

提示:
数据地址点击 https://xf-1252186245.cos.ap-chengdu.myqcloud.com/data/data.js 复制下来放到组件同级目录,命名data.js就好。

上面地址data.js乱码的话,点击 github仓库地址 https://github.com/l-x-f/react-city-select 将代码克隆到本地,源码里有data.js,也可以直接访问 data.js github仓库地址路径。

依赖: react antd rc-form prop-types等, 先安装依赖,步骤略。

CitySelect.jsx 文件

import React, { Component } from "react";
import { createForm } from "rc-form";
import { Cascader } from "antd";
import city from "./data"; //  数据见上提示
import PropTypes from "prop-types";//先配置修饰器 没有配置的话用把 @createForm()删掉
//然后把最后一行 export default CitySelect;  换成 export default createForm()(CitySelect)
@createForm()
class CitySelect extends Component {// props类型检查static propTypes = {//  监听选择onChange: PropTypes.func,// 获取选择值getSelectedValues: PropTypes.func,// 默认值value: PropTypes.array};onCascaderChange = selectedValues => {const { onChange, getSelectedValues } = this.props;const result = [];// 递归查询城市所有数据function findCityData(city) {city.forEach(item => {const { id, label, value, children } = item;if (selectedValues.includes(value)) {result.push({ id, label, value });}if (children && children.length) {findCityData(children);}});}findCityData(city);// 分发监听onChange && onChange(selectedValues);getSelectedValues && getSelectedValues(result);};componentDidMount() {const {form: { setFieldsValue },value: selectedValues} = this.props;if (!selectedValues || !selectedValues.length) {return;}const result = [];// 递归查询城市名称数据function findLabel(children) {children.forEach(item => {const { label, value, children } = item;if (selectedValues.includes(label)) {result.push(value);}if (children && children.length) {findLabel(children);}});}// 卡省份解决县或市名称一样的问题city.forEach(item => {const { label, value, children } = item;if (selectedValues.includes(label)) {result.push(value);if (children && children.length) {findLabel(children);}}});// 设置默认值setFieldsValue({ city: result });}render() {const { getFieldProps } = this.props.form;return (<div><Cascaderoptions={city}{...getFieldProps("city", {onChange: this.onCascaderChange,rules: [{ required: true }]})}placeholder="请选择城市"/></div>);}
}export default CitySelect;

2.使用

import React, { Component } from "react";
import { Form,  Button, message, Icon } from "antd";import CitySelect from "@/components/CitySelect";import "./hotel.less";const FormCreate = Form.create;
const FormItem = Form.Item;@FormCreate()
class HotelSetting extends Component {state = {selectedValues: []};handleReset = () => {this.props.form.resetFields();};// 获取选择值getSelectedValues = selectedValues => {this.setState({selectedValues});};handleSumit = e => {const { form } = this.props;e.preventDefault();form.validateFields((err, formData) => {console.log(formData, "formData");if (err) {message.destroy();return message.warning("请完整填写表单");}const data = {...formData,selectedValues: this.state.selectedValues};console.log(data, "data");});};render() {const { getFieldDecorator } = this.props.form;const defaultCity = ["陕西省", "西安市", "碑林区"];return (<FormclassName="custom-form custom-vertical-hotel-form"layout="vertical"labelAlign="left"onSubmit={e => {this.handleSumit(e);}}style={{ background: "#fff", padding: 24 }}>{/* 数据绑定 拿到的city字段是城市编码  getSelectedValues监听可以拿到选择的数据对象 */}<FormItem label="城市选择:">{getFieldDecorator("city", {initialValue: defaultCity,rules: [{ required: true, message: "请选择城市选择" }]})(<CitySelect getSelectedValues={this.getSelectedValues} />)}</FormItem><FormItem label="城市选择:"><CitySelectgetSelectedValues={this.getSelectedValues}value={defaultCity}/></FormItem><FormItem style={{ paddingBottom: 0 }}><Button type="primary" htmlType="submit"><Icon type="arrow-up" />保存</Button></FormItem></Form>);}
}export default HotelSetting;

hotel.less

:global(.custom-vertical-hotel-form .ant-form-item-label) {width: 90px;vertical-align: top;
}
:global(.custom-vertical-hotel-form .ant-form-item-control-wrapper) {width: 340px;display: inline-block;
}

3.效果及拿到的值


react结合antd的Cascader组件实现pc端选择城市控件相关推荐

  1. ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl

    第四章 组合控件开发CompositeControl 大家好,今天我们来实现一个自定义的控件,之前我们已经知道了,要开发自定义的控件一般继承三个基 类:Control,WebControl,还有一个就 ...

  2. ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇

    第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是行不 通.如果大家开发的是WinForm中的事件,之前的定义可能没有什 ...

  3. ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇

    第三章 为控件添加事件 好了,我们之前以前开发一个控件.而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件. 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.N ...

  4. React给antd中TreeSelect组件左侧加自定义图标icon

    很多时候官网并没有给我们过多地详解来解释他们的产品怎么使用. 今天碰到了一个很恶心的问题,就是在给antd的treeSelect组件加左侧icon的时候,总是报一个警告, Warning: Each ...

  5. 对于 React 结合 Antd 的 Upload 组件实现图片上传

    一. React 结合 Antd 实现图片上传 引入所需相关的组件和文件,代码如下所示: import React, { Component } from 'react' import PropTyp ...

  6. 使用vue-mugen-scroll组件实现pc端滚动刷新

    由于工作的原因,现在需要实现一个滚动加载(PC端)的效果,之前使用的是vue+element,但是element没有类似的组件,所以去github上找了一个名叫vue-mugen-scroll,使用起 ...

  7. 基于webview的选择滑动控件(PC和wap版)

    有了webview,大家开发ios或者安卓的app就方便很多啦. 第一可以增量更新: 第二webview可以同时兼容ios和安卓,减少开发量哦. --------------------------- ...

  8. android使组件居中,Android图文居中显示控件使用方法详解

    最近项目中用到了文字图标的按钮,需要居中显示,如果用TextView实现的方式,必须同时设置padding和drawablePadding.如下: android:layout_width=" ...

  9. android编程多组件布局,Android把多个控件定义成一个整体的布局类使用

    在程序中有时候几个控件要放在一起,想随意放在布局上,而且不仅一个布局要使用,此时就想把这几个控件定义成一个新的View就好了,于是就有了下面这个类新的控件类SeekBarGroup.java,Seek ...

最新文章

  1. ActiveMQ简单使用介绍
  2. 趣学python3(46)--求素数
  3. boost::statechart模块实现无效结果分配测试
  4. python条件语句函数_python sum 函数中可以使用条件语句吗
  5. 屏幕输出语句_C语言快速入门——表达式与语句
  6. JavaScript-Date日期对象
  7. windows2003 ftp 无法下载 解决
  8. random number in groovy
  9. 【makefile系列】调试makefile
  10. 简单php网站的mysql优化小结
  11. Who am I:最烧脑的社会工程学电影
  12. 将 DataDirect ODBC 驱动程序与 Python 和 pyodbc 一起使用
  13. selenium 下载webdriver浏览器驱动
  14. 可以在linux下运行的u盘制作工具,U盘Linux制作工具LiveUSB Creator下载
  15. 多变量微积分笔记10——二重积分的应用
  16. 详解金盾2016替换机器码的几个关键步骤
  17. windows关闭休眠
  18. 10.如何使用 Node.js REPL
  19. 我们应该怎么去认识信贷
  20. ecshop index.php,ecshop  源码分析01 (index.php)

热门文章

  1. 40句让你坦露心声的经典句子!!
  2. Kinect结合Unity开发(一)
  3. 频谱效率是如何定义的
  4. python 如何自动生成exl_python如何做excel自动化
  5. 重磅并购频现大风口下光伏企业待重新估值
  6. VMware10中安装Centos网络无法使用的处理办法
  7. 一文Shader变量使用避坑——uniform、varying变量多次if判断会严重降低帧率
  8. Python - 入门
  9. osi七层模型和tcp\ip协议
  10. 利用ogg微服务版将oracle同步到kafka