-
Notifications
You must be signed in to change notification settings - Fork 297
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
optimize clearedFieldMetaCache #128
Conversation
seem the code in |
In the original code, if use |
learn a lot because of this PR... |
Can you try to add a test case for this? |
Let me try. I haven't written the unit test of jest before. |
sad to find |
add test case;
update |
this.fieldsStore.setFields({ | ||
[name]: this.clearedFieldMetaCache[name].field, | ||
}); | ||
this.fieldsStore.setFieldMeta(name, this.clearedFieldMetaCache[name].meta); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@afc163 这个实现是一直有问题的:
Lines 309 to 314 in 7452074
if (this.clearedFieldMetaCache[name]) { | |
this.fieldsStore.setFields({ | |
[name]: this.clearedFieldMetaCache[name].field, | |
}); | |
this.fieldsStore.setFieldMeta(name, this.clearedFieldMetaCache[name].meta); | |
} |
如果需要切换的两个组件,值的类型不一样,比如一个是 string 一个试 string[],这样切换会报错的,所以还是无法解决 #117 要解决的问题。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
类型不一致就像给一个 string[]
去 setFieldValue 一个 string 类型的值一样。本来就不合理,不在要解决的范围内。
先 pending,等讨论清楚了再做决定。 |
首先,reset fields这部分的修改应该是没有疑问的。 然后,现在因为saveRef中读取cache之后不进行forceUpdate,导致有间隔的remount会在下一次render时发生闪烁。这个情况在Form和Modal同时使用的时候,极其容易触发。因此我认为有必要先防止这种情况的发生。@benjycui 提到的场景,由于当前版本定义field时并不指定类型,所以唯一的解决方案就是此处继续采用1.x版本的方案。 最后,关于解决这个问题的方案。
|
Shall I repeat a PR with only |
我看看。 |
expect(form.getFieldValue('input2')).toBe(undefined); | ||
wrapper.setProps({ mode: true }); | ||
expect(wrapper.find('#text1').getDOMNode().value).toBe('123'); | ||
expect(wrapper.find('#text2').getDOMNode().value).toBe('456'); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
如你所说,两者都不能确定是用户的预期。因此必然需要选择其一,并在文档中说明。
- 1.x版本,切换会隐式reset。
- 我PR的版本,预填之前填过的值。
我之所以PR会这么改,并且加上这个测试样例,是因为我觉得看目前写的代码,是想达到后者的效果。
但在当前的2.x ~ 2.1.6版本中,两者都不是,而是怎么看都是个bug,绝对不可能会是用户的预期。
我可以改成只修改resetFields的版本,但实际上没什么意义。
因为如果最后你们要采用方案一,则实际上我这个PR完全没用,相关代码均要删除,回到1.x。如果你们要采用方案二,就必然要解决下面这个bug,那就是整个merge。我还是希望能一次性搞定这个问题。
参考issue#127这个重现
步骤:
- 在input1输入123,在input2输入456
- 点击
hidden
,再点击visable
。(此时,所有组件还看起来均为空) - 在任一组件随意输入字符,另一个组件闪烁并显示老数据。
当前版本,这个bug在hidden之后,无论是否点击reset均发生。只改resetFields则只能保证hidden后点击reset,再visable后不会闪烁
最后,提供一个不涉及Modal,也就是不会reset依然会发生的场景:Form中一项是选择添加的类型,根据这个类型,会展现不同的剩余item。
先改成只有 resetFields 的 PR 吧,另一个问题需要提供具体的问题再看看。
|
👌,我晚点再看看 modal 这个问题。 |
销毁组件的时候还是直接干掉对应的表单值比较合理。对于 https://codesandbox.io/s/o4nwr2x7z 我找到一个更合理的解决方案,我先合并了这个再发一个 PR。 |
resetFields
will resetclearedFieldMetaCache
now.The time to get
clearedFieldMetaCache
isgetFieldProps
now (saveRef
before).