antd Form组件initialValues属性在React17中延迟渲染问题

需求是点击修改框 然后显示一个Modal框,里面有点击部门的相关权限
在这里插入图片描述
在这里插入图片描述
把点击的数据传进Form组件initialValues,出现bug 数据改变了但是默认值为上一次点击的值!!

可以看到化工学院的值变成上一次点击的信息学院的值


再次点击恢复正常
在这里插入图片描述
再点信息学院,变成化工学院
在这里插入图片描述
关键代码:

      <Modal destroyOnClose={true} title={state.DepartmentName} visible={state.isModalVisible} onOk={handleOk} onCancel={handleCancel}>
        <Form
          preserve={false}
          form={form}
          name="basic"
          labelCol={{
            span: 4,
          }}
          wrapperCol={{
            span: 20,
          }}
          initialValues={
            {
              router: state.InitRoute,
              api: state.InitApi,
            }}
          onFinish={onFinish}
          onFinishFailed={onFinishFailed}
          autoComplete="off"
        >
          <Form.Item
            label="路由权限"
            name="router"
          >
            <Checkbox.Group options={routeList.map((value) => {
              return { value: value.routeId, label: RouterMaper.get(value.routeName) }
            })}
            />
          </Form.Item>

          <Form.Item
            label="操作权限"
            name="api"
          >
            <Checkbox.Group options={apiList.map((value) => {
              return { value: value.apiId, label: ApiMaper.get(value.apiName) }
            })} />
          </Form.Item>
        </Form>
      </Modal>

修改成下面代码后(把初始值直接赋给Checkbox),解决:

		<Modal destroyOnClose={true} title={state.DepartmentName} visible=	{state.isModalVisible} onOk={handleOk} onCancel={handleCancel}>
		
        <Checkbox.Group defaultValue={state.InitRoute} options={routeList.map((value) => {
          return { value: value.routeId, label: RouterMaper.get(value.routeName) }
        })}
        />
        <Checkbox.Group defaultValue={state.InitApi} options={apiList.map((value) => {
          return { value: value.apiId, label: ApiMaper.get(value.apiName) }
        })} />
      </Modal>

解决
在这里插入图片描述
在这里插入图片描述
人麻了,我一开始以为是React的问题,是不是useState异步导致的,改成useReduce还是不行,这才想到是不是antd的问题

在Ant Design(antd)的Form组件中,`Form.Item`用于包裹表单项,并提供了一些默认的布局和验证功能。如果你需要在注入value的时候修改它,可以通过以下几种方式实现: ### 1. 使用`getValueProps`属性 `getValueProps`属性允许你在将值传递给子组件之前对其进行修改。你可以返回一个对象,这个对象会被合并到传递给子组件的props中。 ```jsx import React from 'react'; import { Form, Input } from 'antd'; const MyForm = () => { const [form] = Form.useForm(); const handleValue = (value) => { // 在这里修改value return { value: value && value.toUpperCase(), }; }; return ( <Form form={form}> <Form.Item name="myField" getValueProps={(value) => handleValue(value)} > <Input /> </Form.Item> </Form> ); }; export default MyForm; ``` ### 2. 使用`normalize`属性 `normalize`属性允许你在值变化时对其进行转换。它接收当前值和所有表单值作为参数,并返回转换后的值。 ```jsx import React from 'react'; import { Form, Input } from 'antd'; const MyForm = () => { const [form] = Form.useForm(); const normalizeValue = (value, prevValue, allValues) => { // 在这里修改value return value && value.toUpperCase(); }; return ( <Form form={form}> <Form.Item name="myField" normalize={normalizeValue} > <Input /> </Form.Item> </Form> ); }; export default MyForm; ``` ### 3. 使用`onValuesChange`属性 `onValuesChange`属性允许你在表单值变化时进行自定义处理。你可以在这个回调函数中对值进行修改。 ```jsx import React, { useEffect } from 'react'; import { Form, Input } from 'antd'; const MyForm = () => { const [form] = Form.useForm(); useEffect(() => { form.setFieldsValue({ myField: 'initialValue', }); }, [form]); const handleChange = (changedValues, allValues) => { if (changedValues.myField) { form.setFieldsValue({ myField: changedValues.myField.toUpperCase(), }); } }; return ( <Form form={form} onValuesChange={handleChange}> <Form.Item name="myField" > <Input /> </Form.Item> </Form> ); }; export default MyForm; ``` 通过以上几种方法,你可以根据需要在注入value的时候对其进行修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值