certificate(rule, value, callback, form) {
    const provs = {
      11: '北京',
      12: '天津',
      13: '河北',
      14: '山西',
      15: '内蒙古',
      21: '辽宁',
      22: '吉林',
      23: '黑龙江 ',
      31: '上海',
      32: '江苏',
      33: '浙江',
      34: '安徽',
      35: '福建',
      36: '江西',
      37: '山东',
      41: '河南',
      42: '湖北 ',
      43: '湖南',
      44: '广东',
      45: '广西',
      46: '海南',
      50: '重庆',
      51: '四川',
      52: '贵州',
      53: '云南',
      54: '西藏 ',
      61: '陕西',
      62: '甘肃',
      63: '青海',
      64: '宁夏',
      65: '新疆',
      71: '台湾',
      81: '香港',
      82: '澳门',
      91: '国外',
    };
    let iSum = 0;
    const type = form.getFieldValue('idType'); // 获取到证件类型
    if (!type && value.replace(/\s+/g, '')) {
      // 如果输入了证件号,校验证件类型
      form.validateFields(['idType'], { force: true });
    } else if (type && !value.replace(/\s+/g, '')) {
      // 如果有证件号,校验证件类型
      return Promise.reject('请输入证件号');
    } else if (type && value.replace(/\s+/g, '')) {
      switch (type) {
        case 1:
          if (!/^\d{17}(\d|x)$/i.test(value.replace(/\s+/g, ''))) {
            return Promise.reject('输入的身份证长度或格式错误');
          }
          value = value.replace(/\s+/g, '').replace(/x$/i, 'a');
          // eslint-disable-next-line radix
          if (provs[parseInt(value.replace(/\s+/g, '').substr(0, 2))] == null) {
            return Promise.reject('您的身份证地区非法');
          }
          // eslint-disable-next-line no-case-declarations
          const isBirthday = `${value.replace(/\s+/g, '').substr(6, 4)}-${Number(
            value.replace(/\s+/g, '').substr(10, 2),
          )}-${Number(value.replace(/\s+/g, '').substr(12, 2))}`;
          // eslint-disable-next-line no-case-declarations
          const d = new Date(isBirthday.replace(/-/g, '/'));
          if (isBirthday !== `${d.getFullYear()}-${d.getMonth() + 1}-${d.getDate()}`) {
            return Promise.reject('输入的身份证上的出生日期非法');
          }
          // eslint-disable-next-line no-restricted-properties
          for (let i = 17; i >= 0; i--)
            iSum += (Math.pow(2, i) % 11) * parseInt(value.replace(/\s+/g, '').charAt(17 - i), 11);
          if (iSum % 11 !== 1) {
            return Promise.reject('你输入的身份证号非法');
          }
          break;
        case 2:
          if (!/^\d{8}(\d{2})?$/.test(value.replace(/\s+/g, '')))
            return Promise.reject('台湾居民来往大陆通行证输入有误');
          break;
        case 3:
          if (!/^(H|M)\d{8}$/.test(value.replace(/\s+/g, ''))) return Promise.reject('港澳居民来往内地通行证输入有误');
          break;
        default:
          return Promise.resolve();
      }
    }
    return Promise.resolve();
  },
};

使用方式如下:

<FormItem
        {...formLayout.formItemLayout}
        label="证件号"
        name="pati_id_number"
        initialValue={pati_id_number}
        rules={[
          { required, message: '必填项!' },
          {
            validator: (rule, value, callback) => validate.certificate(rule, value, callback, form)
          }
        ]}
      >
        <Input
          placeholder="证件号"
          allowClear
          disabled={status === '2'}
        />
      </FormItem>

更多推荐