在我的代码中,试图通过名为的函数呈现Redux Form的<DatePicker>
in<Field>
组件renderDatePicker()
。此函数链接到handleClick()
状态变量isOpen
设置为的函数true
。
因此,理想情况下,onClick
应渲染<DatePicker>
设置为可见的。但是代码不会更新任何内容。我在哪里做错了?
注意:<DatePicker>
直接在无需的帮助下进行渲染<Field component=...>
,效果很好。
对于调试,完整的代码位于CodeSandbox中,
SimpleForm.js
import React from "react";
import { reduxForm } from "redux-form";
import { Field } from "redux-form";
import DatePicker from "react-mobile-datepicker";
class SimpleForm extends React.Component {
constructor(props) {
super(props);
this.state = {
time: new Date(),
isOpen: false
};
this.handleClick = this.handleClick.bind(this);
}
renderDatePicker = () => (
<DatePicker
value={this.state.time}
isOpen={this.state.isOpen}
onSelect={this.handleSelect}
onCancel={this.handleCancel}
/>
);
handleClick() {
this.setState({ isOpen: true }, function() {
console.log(this.state.isOpen);
});
}
handleCancel = () => {
this.setState({ isOpen: false });
};
handleSelect = time => {
this.setState({ time, isOpen: false });
};
render() {
return (
<div>
<button className="select-btn" onClick={this.handleClick}>
select time
</button>
<Field
name="date"
type="date"
component={this.renderDatePicker}
label={"date"}
/>
</div>
);
}
}
export default reduxForm({
form: "simple" // a unique identifier for this form
})(SimpleForm);
此行为的原因在于react-formField
组件的实现。它会对其所有属性进行浅表比较,以决定是否应重新渲染。您可以随意更改组件的名称state
,对它的引用this.renderDatePicker
不会更改。
Field
将属性(包括onChange
处理程序和当前属性)传递value
到该字段的component
无状态函数调用中以通知更改,但这在这里并不适用,因为您的切换按钮不在该字段之外。
因此,我想到的一种选择是将您的按钮移至渲染字段中,然后调用onChange(!value)
。
一个更简单但更肮脏的选择是在component
属性中使用箭头功能:component={() => this.renderDatePicker()}
-此实例随着您的每次重新渲染而更改SimpleForm
(即,如果state
更改),因此会带来成本,但是取决于应用程序的复杂性,成本可忽略不计。为了减轻影响,您可以实施shouldComponentUpdate
(就像redux-formField
一样)根据当前isOpen
状态和下一个状态决定是否应重新呈现。
在redux格式中检查此位以获取更多详细信息:https : //github.com/erikras/redux-form/blob/master/src/createField.js#L44
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句