antd 表单项联动验证时,disabled属性不生效

9 篇文章 0 订阅

在antd表单中,表单项验证条件是根据其他表单项的值决定的,比如当前【时间限制】选择【无】时,【限制时段】表单项不可用
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

所以我单纯使用

disabled={sourceForm.getFieldValue().timeLimit}

是不生效的,因为disabled切换会涉及到state渲染,而直接使用 【获取表单字段属性】有可能是上一次的状态 ,导致渲染失败

解决办法:

1.在表单项改变的时候 ,单独使用一个【state状态】改变来驱动页面更新,使表单联动

 const [timeLimitVal, setTimeLimitVal] = useState(true);
 <Form.Item
              bordered={true}
              label="时间限制"
              name="timeLimit"
              rules={[{ required: true, message: '请输入时间限制' }]}
              className={styles.detail}
            >
              <Radio.Group
                onChange={(e) => {
                  sourceForm.validateFields(['periodDate']);
                  sourceForm.validateFields(['rangeTime']);
                  setTimeLimitVal(e.target.value === 1); 
                }}
              >
                <Radio value={1}>有(时间限制满足时才能进行方案推荐)</Radio>
                <Radio value={0}></Radio>
              </Radio.Group>
            </Form.Item>


使用的时候,直接使用state状态值即可

 <Radio.Group
                onChange={(e) => {
                  let val = e.target.value;
                  if (val === 1 || val === 2) {
                    setSelectTime([]);
                  }
                }}
                disabled={!timeLimitVal}
              >
   <Radio value={1}>每天</Radio>
   <Radio value={2}>法定工作日</Radio>
 </Radio.Group>

但是这种方法有点麻烦,感觉还是有点太笨了哈哈
然后我们使用antd 官网文档中的方法shouldUpdate

2.<Form.Item shouldUpdate>

在这里插入图片描述
当 shouldUpdate 为 true 时,Form 的任意变化都会使该 Form.Item 重新渲染。这对于自定义渲染一些区域十分有帮助,要注意 Form.Item 里包裹的子组件必须由函数返回,否则 shouldUpdate 不会起作用

然后我们按照示例写,直接将shouldUpdate放在Form.Item上,发现我的子组件就算是用return返回也全部消失了
此为示例
在这里插入图片描述
在这里插入图片描述
然后又试用了一下官网的另一个示例,就是把带name的formItem和带shouleUpdate的formItem分开,使用嵌套写,发现这次成功了!
在这里插入图片描述
上一下关键代码吧

  <Form.Item shouldUpdate>
              {({ getFieldValue }) => {
                const timeLimitVal = getFieldValue('timeLimit');
                return (
                  <Form.Item
                    bordered={true}
                    label="限制时段:时间"
                    name="rangeTime"
                    className={`${styles.detailItem} ${styles.detail}`}
                    id={styles.detail}
                  >
                    <div>222</div>
                  </Form.Item>
                )
              }}
            </Form.Item>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值