当前位置:   article > 正文

antd react的from表单校验几种常用的方式_react form表单的检验

react form表单的检验

先上图:

点击保存时表单不校验,其余单独的字段比如组织机构、年度、月度校验

点击保存并提交时,表单也要检验:

一、表单的校验

对于同一个表单,点击不同按钮触发不同请求如何区别校验,并且每次点击按钮时都重新加载校验,我是这样解决的: 

思路:其实就是搞一个标记区分点击了哪个按钮,我这边的这个界面实现用了两个组件,界面展示的父组件和校验输入的子组件,有个问题是父组件中如果用点击按钮后用setState设置一个标记状态再传到子组件,点完保存按钮又点击保存并提交按钮,state传到子组件是异步的,可以这样解决:

父组件中:

  1. //1.设置一个对象存state,而不是直接字段
  2. state = {
  3. saveFlag: { flag: false },
  4. }
  5. //2.保存或者保存并提交按钮这里不用setState,而是直接赋值
  6. <Button type="primary" style={{ marginRight: 20, display: this.props.viewType === 'view' ? 'none' : '' }} onClick={() => { this.state.saveFlag.flag = false; this.saveButton(); }} >保存</Button>
  7. <Button type="primary" style={{ display: this.props.viewType === 'view' ? 'none' : '' }} onClick={() => { this.state.saveFlag.flag = true; this.saveAndSubmitButton(); }} >保存并提交</Button>

找到antd文档表单校验那里validateFields方法加上一个属性force让已经校验过的表单,在 validateTrigger 再次被触发时再次校验,人家默认是false改成true即可,按文档要求格式改

把值扔到子组件:

 子组件直接上代码:

主要关注点是检验的validator属性使用自定义校验

  1. @Form.create()
  2. export default class EditableCell extends React.Component {
  3. handleInputChange = (dataIndex, value) => {
  4. this.props.handleSave({ ...this.props.record, [dataIndex]: value });
  5. }
  6. checkSaveFlag = (rule, value, callback) => {
  7. if (!value && this.props.saveFlag.flag === true){
  8. callback('请完成此项');
  9. } else {
  10. callback();
  11. }
  12. }
  13. getInput = (record, dataIndex) => {
  14. // const valType = record && record.reportIndex ? (record.valType || record.reportIndex.valType) : undefined;
  15. const valType = record ? (record.valType || (record.reportIndex && record.reportIndex.valType)) : undefined;
  16. if (valType === 1 || valType === 2) { //valType = 1时,是整数;valType = 2时,是小数
  17. return <InputNumber onChange={value => this.handleInputChange(dataIndex, value)} min={0} precision={valType === 1 ? 0 : 2} style={{ width: '100%' }} />;
  18. } else if (valType === 3) { //百分数,需要除以100再传给后台
  19. return (
  20. <InputNumber
  21. onChange={value => this.handleInputChange(dataIndex, value / 100)}
  22. min={0}
  23. precision={2}
  24. style={{ width: '100%' }}
  25. formatter={value => (value || value === 0 ? `${value}%` : '')}
  26. parser={value => value.replace('%', '')}
  27. />
  28. );
  29. }
  30. return <InputNumber onChange={value => this.handleInputChange(dataIndex, value)} min={0} precision={0} style={{ width: '100%' }} />;
  31. }
  32. render() {
  33. const {
  34. editable,
  35. dataIndex,
  36. title,
  37. record,
  38. index,
  39. myForm, //将父组件的form传入子组件,便于在父组件中调用form方法验证表单
  40. saveOrSubmitFlag,
  41. saveFlag,
  42. ...restProps
  43. } = this.props;
  44. const valType = record ? (record.valType || (record.reportIndex && record.reportIndex.valType)) : undefined;
  45. return (
  46. <td ref={(node) => { this.cell = node; }} {...restProps} >
  47. {editable ? (
  48. <EditableContext.Consumer>
  49. {() => {
  50. let initialValueData = null;
  51. if (record[dataIndex]) {
  52. initialValueData = record[dataIndex];
  53. }
  54. return (
  55. <FormItem style={{ margin: 0, paddingRight: 10, paddingLeft: 10 }}>
  56. {myForm.getFieldDecorator(dataIndex + record.keyX, {//+record.key是为了让每一行的表单项字段名唯一
  57. rules: [{
  58. validator: this.checkSaveFlag,
  59. }],
  60. validateTrigger: 'onSubmit',
  61. initialValue: initialValueData && valType === 3 ? (initialValueData * 100) : initialValueData,
  62. })(
  63. this.getInput(record, dataIndex)
  64. )}
  65. </FormItem>
  66. );
  67. }}
  68. </EditableContext.Consumer>
  69. ) : restProps.children}
  70. </td>
  71. );
  72. }
  73. }

如果自定义校验想传其他字段可以这样:

  1. rules: [{
  2. validator: this.checkSaveFlag.bind(this, dataIndex),
  3. }],

二、其他字段的检验

这个没啥好说的就是普通的rules校验,按照官方文档来:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/115581
推荐阅读
相关标签
  

闽ICP备14008679号