-
-
Notifications
You must be signed in to change notification settings - Fork 47.5k
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
Form 组件结合类似 Redux 等框架,外部 store 存储 fields 。修改会重复触发 onFieldsChange #2934
Comments
和redux结合的时候,我这边也有这个问题,并且onFieldsChange触发三次,导致表单输入的时候非常卡顿 |
@clarkhan 你好,你那边目前有什么解决方案吗? |
@wuyezhong 我是才发现不久,针对多次触发的问题还没啥好方案。 导致表单输入很卡的话,是不是页面比较复杂?
总之用一些 React 优化的相关方法。:joy: 我很好奇,为啥你会触发三次,难道和使用有关? |
@clarkhan 谢谢你的回复。页面到不至于复杂。就是不知道为什么会卡。 |
我在用antd做页面时也遇到性能问题 ,我是这样理解的,不知对否供大家参考, 应该是getFieldProps 出的问题,我觉得有两个问题 2、各个包含getFieldProps组件在父页面刷新时其也同时刷新,所以页面内组件一多就卡。(可以将node_modules\react\lib\ReactComponentWithPureRenderMixin.js里的 以上两点导致性能问题。 建议能否: |
请教一下form怎么和redux的store做双向的绑定?我现在在onFieldsChange里调用action更新store,但是store里的值被更新后并不会更新form。有没有方便的方法做到? |
@cqqccqc 你可以参照我上面提出问题的重现演示。其中的 function mapPropsToFields(props) {
return props.fields;
} 是更新 from 内容的关键。 @ddcat1115 这个问题,onFieldsChange 重复被触发,觉得应该像 bug 更多一点。 |
这个是正常的,@clarkhan 认真对比下除了 value 之外的字段,你会发现真的改变了。 @wuyezhong 触发三次的问题,麻烦提供重现 demo。 Please provide a re-producible demo: http://codepen.io/benjycui/pen/KgPZrE?editors=001 |
@benjycui 的确,其他字段有改变,是 antd 内部实现逻辑必须要这样的过程吗? 感觉修改一次,触发一次 onChange 更合理点,两次有点怪怪的 😟 |
|
确实触发了两次,我看到validating由true变成了false |
@yiminghe 这个我来看看吧 |
onFieldsChange 触发两次是预期的行为,上面已经有说明了,这个我先关了,其他问题另外开 issue 吧。 |
|
@benjycui 另外,这个判断是没用的,两次的props是同一个,所以还是会触发两次 |
@caolvchong @clarkhan 确认一下, 最好给出一个实际点的 demo |
并没有超出预期,因为 fields 并不仅是 value。 |
@cqqccqc 你调用action时遇到表单刷新的问题吗 |
建议onFieldsChange调用两次的情况,文档注明下,一般人直觉应该是一次。我就碰到了这个违反直觉的东西,然后google之,带到这里,知道原因 |
可以用 onValuesChange |
const CustomizedForm = Form.create({
onFieldsChange(props, changedFields) {
// 倘若注释这一行代码,表单项的值依旧可以改变,是不是不符合受控组件的概念?
props.actionChangedFields( changedFields ) ;
},
mapPropsToFields(props) {
return {
username: Form.createFormField({
...props.username,
value: props.username.value,
}),
};
},
onValuesChange(_, values) {
console.log(values);
},
}) 纯属讨论,我发现我用redux绑定了表单的值,从redux中拿到值,然后用 onFieldsChange(props, fields) {
console.log('onFieldsChange', fields);
//props.dispatch({
// type: 'save_fields',
// payload: fields,
//});
}, |
本地环境
你做了什么?
redux 结合 From 使用。表单修改一次。
你期待的结果是:
Form 的 onFieldsChange 被触发一次, redux 的 Action 与 reducer 执行一次
实际上的结果:
onFieldsChange 触发两次。导致其他逻辑也重复执行。
可重现的在线演示
为防止其他库干扰,已全部去掉。只用 React 和 antd Form 实现(打开 Console,修改表单数据):
http://codepen.io/clarkhan/pen/vXYRgz?editors=1010
The text was updated successfully, but these errors were encountered: