关于antd中的Form组件设置了initialValues属性后,如何在state或者props中的属性变化后,重新渲染修改Form中的数据显示的三种解决办法 React Typescript

关于antd中的Form组件设置了initialValues属性后,如何在state或者props中的属性变化后,重新渲染修改Form中的数据显示

在使用antd的Form组件的时候,遇到这样一个问题:

描述:给Form组件设置的initialValues={Object} 只能在初始的时候生效,也就是说,我们如果只改变了state中的值,是无法导致Form中的数据发生变化的。因为使用Form组件后,数据就会同步给Form接管,所以我们得使用form对象里的方法来改变数据的变化。

在开始之前我们得了解一下问题:经过输出打印,我们可以很清楚的看到,props.user的值是可以发生变化的,但是因为initialValues属性只能在初始情况赋值,后续props.user发生改变后,我们是无法导致数据重新渲染的。
在这里插入图片描述
这是一个简单的例子,问题简单的说就是点击修改后,每次都只显示第一次点击的数据信息,而我们需要的是每次点击修改时,获取到的是所在行的数据

	所以有以下思路:每次数据发生变化后,resetField重置Form组件。或者使用setFieldValue控制属性值

在这里插入图片描述

经过摸索,找到了以下三种解决方案:

1、在Hook中
首先我们得创建一个FormInstance类型的Ref,并将他绑定到Form标签上
在这里插入图片描述在这里插入图片描述
然后在useEffect中,通过监听props.user这个属性,然后调用ref身上的resetFields方法
在这里插入图片描述

2、在Hook中
首先在v3版本,我们一般的做法是通过Form.create()(xxx)这种把组件包裹成高阶组件的方式,来把form对象通过props传递给组件
而在v4版本中,使用Hook的话,可以使用 Form.useForm()方法来获取到form对象,既const [form] = Form.useForm() //数组的解构赋值 来获取到form
在这里插入图片描述
在内部定义一个立即执行函数,表示每次调用类的时候,可以在return之前先执行一次。在里面使用form对象上的setFieldsValue(Object)方法,重新将props中的user赋值给Form组件

注意:使用setFieldsValue时,如果Form组件是处于Modal下,Modal的属性必须加一个forceRender={true}的属性。因为有时候form是underfined,这是因为当你弹出弹窗时form还没有渲染造成的,即使你在setState回调中获取form实例也无法取到。所以加了这个forceRender就可以解决这个问题
在这里插入图片描述

3、在class组件中
在class组件中,主要是通过ref来获取数据域
在这里插入图片描述
然后绑定到Form组件上
在这里插入图片描述
然后在render函数执行开始时,先使用ref.current身上的setFieldsValue(Object)方法重新赋值
在这里插入图片描述

  • 14
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
你可以使用Antd的Table组件的onRow属性来监听行的双击事件,然后在事件处理函数弹出一个Modal组件显示该行的内容。 以下是一个示例代码: ```javascript import { Table, Modal } from 'antd'; const dataSource = [ { key: '1', name: 'John Brown', age: 32, address: 'New York No. 1 Lake Park', }, { key: '2', name: 'Jim Green', age: 42, address: 'London No. 1 Lake Park', }, { key: '3', name: 'Joe Black', age: 32, address: 'Sidney No. 1 Lake Park', }, ]; const columns = [ { title: 'Name', dataIndex: 'name', key: 'name', }, { title: 'Age', dataIndex: 'age', key: 'age', }, { title: 'Address', dataIndex: 'address', key: 'address', }, ]; const MyTable = () => { const [visible, setVisible] = useState(false); const [selectedRow, setSelectedRow] = useState(null); const handleRowDoubleClick = (record) => { setSelectedRow(record); setVisible(true); }; const handleModalClose = () => { setVisible(false); }; return ( <> <Table dataSource={dataSource} columns={columns} onRow={(record) => ({ onDoubleClick: () => { handleRowDoubleClick(record); }, })} /> {selectedRow && ( <Modal visible={visible} onCancel={handleModalClose} onOk={handleModalClose} > <p>{selectedRow.name}</p> <p>{selectedRow.age}</p> <p>{selectedRow.address}</p> </Modal> )} </> ); }; export default MyTable; ``` 在这个示例,我们使用了Antd的Table组件渲染一个表格,然后监听了行的双击事件,并在事件处理函数设置了当前选的行,并显示了一个Modal组件显示该行的内容。注意,我们使用了useState来保存当前选的行和Modal组件的可见性状态。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无心同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值