1. Antd表单中,一个getFieldDecorator里只能包含一个受控组件
  2. 封装的受控组件,直接通过value属性,获取initialValue的默认值,做相应的处理,回填到Input
  3. 在子组件中,input的值发生改变,可通过props.onChange,将子组件中处理好的 value值传递到父组件中,在父组件中直接获取值
  4. 正则/^(0[0-9]{2,3}-)([2-9][0-9]{6,7})+(-[0-9]{1,4})?$/
    1. 区号0开头3或4位
    2. 座机号2开头7或8位
    3. 分机号最多4位

image.png

组件场景

  1. 需要输入座机号,至少包含区号和座机号,分机号为非必填字段
  2. 输入一个字符号串 023-45670987,输出也是一个字符串 023-65670987

Antd Form受控组件

  1. Antd表单中,一个getFieldDecorator里只能包含一个受控组件,否则,js脚本会报错,
    1. 其实这也不难理解,如果有多个受控组件,表单的值改变,是改变那个组件的value呢?
  2. 自定义封装一个受控组件,在组件里去做具体的逻辑操作判断
  3. antd受控组件

    1. value
    2. onChange
  4. 如果将3个input框,分别放在3个Form.Item中,布局需要调整,如果再存在一定的关联关系,分开校验,就麻烦了,提示语在那个FormItem下面??

  5. 优化: 自定义封装一个受控组件,在组件里去做具体的逻辑操作判断

telephone组件

  1. import React, { PureComponent } from 'react'
  2. import { Input, Col } from 'antd'
  3. class TelePhone extends PureComponent {
  4. state = {
  5. data: [],
  6. }
  7. componentDidMount() {
  8. // 受控组件中,可直接通过value属性,获取initialValue的默认值
  9. const { value = '' } = this.props
  10. if (!value) return
  11. const data = value.split('-')
  12. this.setState({ data })
  13. }
  14. onChange = e => {
  15. const { data } = this.state
  16. const { id, value } = e.currentTarget // <input id='0' value='23'>
  17. data[id] = value.replace(/^\s+|\s+$/gm, '') // 去除空格
  18. // 如果分机号为空,就删除数组最后一个,排除最后一个中划线 '023-45670987-'
  19. if (id === '2' && !value.length) {
  20. data.pop()
  21. }
  22. const newValue = data.join('-') // '023-45670987-23'
  23. if (newValue !== this.props.value) {
  24. this.props.onChange(newValue)
  25. }
  26. }
  27. render() {
  28. const { state, onChange } = this
  29. const [value1='', value2='', value3=''] = state.data
  30. return (
  31. <Input.Group>
  32. <Col span={7}>
  33. <Input
  34. id="0"
  35. placeholder="区号"
  36. value={value1}
  37. onChange={onChange}/>
  38. </Col>
  39. <Col span={10}>
  40. <Input
  41. id="1"
  42. placeholder="座机号"
  43. value={value2}
  44. onChange={onChange}/>
  45. </Col>
  46. <Col span={7}>
  47. <Input
  48. id="2"
  49. placeholder="分机号"
  50. value={value3}
  51. onChange={onChange}/>
  52. </Col>
  53. </Input.Group>
  54. )
  55. }
  56. }
  57. export default TelePhone

正则说明

  1. \s表示匹配任何空白字符,包括空格、制表符、换页符等等,
    1. 等价于[ \f\n\r\t\v]而”\s+”则表示匹配任意多个上面的字符
  2. [\s]表示,只要出现空白就匹配[\S]表示,非空白就匹配
    1. value.replace(/^\s+|\s+$/gm, '')

使用组件

  1. <Col span={10}>
  2. <Form.Item label={ lang.column }>
  3. {form.getFieldDecorator('telephone', {
  4. initialValue: '', // 023-45670987
  5. rules: [
  6. {
  7. required: true,
  8. message: '请输入座机号',
  9. },
  10. {
  11. pattern: /^(0[0-9]{2,3}-)([2-9][0-9]{6,7})+(-[0-9]{1,4})?$/,
  12. message: '请输入正确的座机号',
  13. },
  14. ],
  15. })(<TelePhone onChange={ this.phoneChange }/>)
  16. }
  17. </Form.Item>
  18. </Col>
  19. // 实时获取数据
  20. telephoneChange = (value) => {
  21. console.log('telephone', value)
  22. }