利用ant-design封装react的地址输入组件
在上一节利用element-ui封装地址输入的组件留下了个尾巴,说react搭配ant-design封装一下地址输入的组件的。本来应该早早就完成的,但是由于这中间发生了一些事情,导致了突发性的换了工作,所以一直耽误到现在,今天就把这个尾巴结束吧!
事实上,ant-design在form组件内提供了自定义表单控件的写法,这里需要做的也就是把这个自定义表单控件搬过来而已。
其实,关键在于,属性值value,和事件onChange。然后,组件内部在constructor的时候,转换传递过来的value,当Cascader的onChange事件发生时,获取新的数据值,调用this.props.onChange事件,同理,在Input组件发生onChange事件时,也是获取新的e.target.value,调用this.props.onChange事件。
到这里,基本上这个组件封装就完成了。
对比一下element-ui发现,两者本质上是一致的。
都是利用内部组件各自onChange时,获取最新的值,然后调用props.onChange事件,把数值传递给使用者。很容易理解,在Cascader发生onChange时,调用props.onChange,比较不好理解的是,Input组件也是在onChange时,调用props.onChange,而不是我们通常理解的发生input时,调用props.onChange,这是为什么呢?
不管是element-ui,还是ant-desigin,都没有向我们暴露Input组件的input事件,所以我们就没有办法获取Input组件的input事件,所以只好退而求其次的使用change事件。然后,在vue中,为了使用v-model指令,我们需要添加mode:{event: 'change', prop:'value' }属性,而在react中,没有类似的指令,都是以属性形式传递的,所以直接使用value和onChange即可。
还是直接贴代码吧!
import React, { Component } from 'react'
import { Form, Input, Row, Col, Cascader } from 'antd'
// 城市选择过滤函数
function filter (inputValue, path) {
return path.some(option => option.name.toLowerCase().indexOf(inputValue.toLowerCase()) > -1)
} class AddressInput extends Component {
static getDerivedStateFromProps (nextProps) { // Should be a controlled component.
if ('value' in nextProps) {
return {
...(nextProps.value || {}),
}
}
return null
}
constructor(props) {
super(props) const value = props.value || {}
this.state = {
values: value.values || [],
registeredAddress: value.registeredAddress || '',
}
this.cascader = {}
} handleAddressChange = e => {
const registeredAddress = e.target.value || ''
if (!('value' in this.props)) {
this.setState({ registeredAddress })
}
this.triggerChange({ registeredAddress })
} handleCascaderChange = (values, items) => {
this.setState({ values })
this.cascader = {
areaCode: values.slice(-1)[0],
areaProvince: items[0].name,
areaCity: items[1].name,
areaDistrict: items.slice(-1)[0].name
}
this.triggerChange({ values })
} triggerChange = changedValue => {
const onChange = this.props.onChange
if (onChange) {
const item = Object.assign({}, this.state, this.cascader, changedValue)
if (item.values) delete item.values
onChange(item)
}
} render () {
const { values, registeredAddress } = this.state
// console.log(values)
const { allowClear = false, regionData = [], size = 'default' } = this.props
return (
<Row gutter={8} type="flex" justify="space-between" >
<Col span={12}>
<Cascader
allowClear={allowClear}
size={size}
value={values}
options={regionData}
fieldNames={{ value: 'code', label: 'name' }}
showSearch={{ filter }}
onChange={this.handleCascaderChange}
placeholder="请选择省市区" />
</Col>
<Col span={12}>
<Input
size={size}
placeholder="请输入具体地址"
value={registeredAddress}
onChange={this.handleAddressChange}
/>
</Col>
</Row>
)
}
} export default Form.create({ name: 'customized_form_controls' })(AddressInput)
利用ant-design封装react的地址输入组件的更多相关文章
- ElementUI(vue UI库)、iView(vue UI库)、ant design(react UI库)中组件的区别
ElementUI(vue UI库).iView(vue UI库).ant design(react UI库)中组件的区别: 事项 ElementUI iView ant design 全局加载进度条 ...
- Ant Design of React 框架使用总结1
一. 为什么要用UI 框架 统一了样式交互动画 . Ui框架会对样式,交互动画进行统一,保证了系统风格完整统一,不像拼凑起来的. 兼容性 ,不是去兼容IE 6 7 8那些低版本浏览器,而是对主流的标 ...
- 同时使用 Ant Design of React 中 Mention 和 Form
使用场景,在一个列表中,点击每一行会弹出一个表单,通过修改表单数据并提交来修改这一行的数据,其中某个数据的填写需要通过Mention实现动态提示及自动补全的功能. 具体效果为: 遇到的问题: 1.希望 ...
- react使用ant design pro时的滑动图片组件
react的滑动图片验证,是基于https://segmentfault.com/a/1190000018309458?utm_source=tag-newest做的修改,改动的主要有以下几点: 1. ...
- button JS篇ant Design of react
这篇看ant Desgin of react的button按钮的js代码,js代码部分是typescript+react写的. button组件里面引用了哪些组件: import * as React ...
- button JS篇ant Design of react之二
最近更新有点慢,更新慢的原因最近在看 <css世界>这本书,感觉很不错 <JavaScript高级程序设计> 这本书已经看了很多遍了,主要是复习前端的基础知识,基础知识经常会过 ...
- Ant Design项目记录和CSS3的总结和Es6的基本总结
这里主要是介绍自己运用ANT框架的一些小总结,以前写到word里,现在要慢慢传上来, 辅助生殖项目总结:从每个组件的运用的方法和问题来总结项目. 1.项目介绍 辅助生殖项目主要运用的是Ant.desi ...
- 【React自制全家桶】一、Webstrom+React+Ant Design+echarts搭建react项目
前言 一.React是Facebook推出的一个前端框架,之前被用于著名的社交媒体Instagram中,后来由于取得了不错的反响,于是Facebook决定将其开源.出身名门的React也不负众望,成功 ...
- React + Ant Design网页,配置
第一个React + Ant Design网页(一.配置+编写主页) 引用博主的另外一篇VUE2.0+ElementUI教程, 请移步: https://blog.csdn.net/u0129070 ...
随机推荐
- go区分操作系统
package main import ( "fmt" "runtime" ) func main() { fmt.Println("Go runs ...
- xman随机数相关题目
参加xman夏令营,大佬给我们带来了密码学课程.其中随机数部分感受颇深,记录下几个脚本. 1. 以时间作为种子的随机数 https://www.jarvisoj.com/ 的[xman2019]bab ...
- mysql 中常用的 sql 语句
SQL分类: DDL-----数据定义语言(CREATE--创建,ALTER--修改. DROP--删除表,DECLARE--声明) DML-----数据定义语言(SELECT--查询,DELECT- ...
- 爬虫之代理和cookie的处理
代理操作 代理的目的 为解决ip被封的情况 什么是代理 代理服务器:fiddler 为什么使用代理可以改变请求的ip 本机的请求会先发送给代理服务器,代理服务器会接受本机发送过来的请求(当前请求对应的 ...
- vue问题五:element ui组件的开始时间-结束时间验证
<el-date-picker v-model="seach.before" type="date" placeholder="开始时间&quo ...
- produceTestDate
set serveroutput on --使用基本变量类型 declare --定义基本变量:类型 --基本数据类型 pnumber , ); pname ); pdate date; begin ...
- SpringBoot 部署到Linux开机自启动和运行
前文 SpringBoot是一个强大的微服务框架,通常都是打包项目成Jar包,并部署到服务器上,本文以Linux服务器部署为主 开机自启动 博文:<https://www.cnblogs.com ...
- 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_01-自定义查询页面-服务端-Dao
在页面输入查询条件,查询符合条件的页面信息. 查询条件如下: 站点Id:精确匹配 模板Id:精确匹配 页面别名:模糊匹配 spring mongoDB如何自定义条件 在Repository的findA ...
- windows 下OPENSSL 生成秘钥和公钥的方法
1. 生成原始 RSA私钥文件 private_key.pem openssl genrsa -out private_key.pem 1024 2. 将原始 RSA私钥转换为 pkcs8格式 ope ...
- 如何屏蔽掉烦人的www.google-analytics.com
有时候在开发的网站项目中会加载谷歌分析的js,并且加载的非常慢导致浏览器一直在转圈圈. 按下面的方法可屏蔽掉烦人的www.google-analytics.com 现在想只有屏蔽掉google-a ...