有关setFieldsValue的问题一(七日打卡)

2,073 阅读3分钟

这段时间有遇到一个有关于Antd-Form组件的一些问题,凭我直觉,这肯定不是我能遇到有关setFieldsValue的所有问题,所以就先写个一在这摆着,以后再有遇到了再进行总结再写二

Warning: You cannot set a form field before rendering a field associated with the value.

这个问题我还查了下翻译,大致意思是“不能在呈现与值关联的字段之前设置表单字段”。

背景

大概当时是这么个情形:

需求那边发现了个bug,有个页面大致是由一个Tabs组件组成,然后每个TabPane内都是一个动态可增删的list表单,删除TabPane内list的数据的时候,总是会删除最后一条数据。

我第一时间反应,这肯定是没有设置key值导致的渲染异常!然后我就信誓旦旦地去查阅了代码。好家伙,果然就不是这个问题导致的...大佬写代码何其严谨,怎么可能会犯这种低级错误...

然后debug看了下数据的变化,发现在删除数据的时候,setFieldsValue并没有实现相应的设置值。代码大概是这样写的。

const data = getFieldsValue("data");
const selector = this.state.selector[index];
data[selector].splice(index, 1);
setFieldsValue({data});

大概是这个样子,应该出入还是挺大...记不太清是具体了。这个data并不是简单的对象,而删除的数据也并不是表层的某个数据,而且对象内的某个数组内的某个数组数据。有点绕,但是当时代码就这样写的...也没有去重写过,只好在其上进行更改。

解决

针对于这个情况,我进行了一系列度娘行为和谷哥行为。当然得到的反馈也是很多,归根结底就是对setFieldsValue的使用不当。 

根据Antd Form内对setFieldsValue的描述可以知道,setFieldsValue是用来对一组控件赋值的。 

重点来了!这里强调的是控件,当赋值的控件key还不存在的时候,就会报错题目当中的警告。也就是说,在还没有在getFieldDecorator进行绑定之前,是不能被赋值的。 在使用React的过程中,一般是不会存在没有渲染组件就直接对其进行赋值的情况...如果有特殊情况,那就是我还没遇到过... 

有了以上原因,大致能够推断出,本次报错的原因是由于对未绑定的属性进行了赋值。 但是代码里是将整个获取到的data一起赋值,极有可能就是由于部分还并没有绑定,但是此刻的data就一起捆绑赋值了。

于是我便打算单个赋值,但是我并没有使用过如何给数组内的单个赋值,或者是给对象内的某个字段的某个字段赋值,这个字段肯定都是不固定的,都是拼接上去的。然后查了下如何单个赋值,发现可以这样对其赋值

setFieldsValue({
    data: {
        `key[${index}]`: dataSource
    }
})

可以使用模板字符串的形式将这个字段引进去