我想控制文本输入时遇到问题,但它需要支持一个空值。这是我的组件:
import React, { Component, PropTypes } from 'react';
import { ControlLabel, FormControl, FormGroup } from 'react-bootstrap';
const propTypes = {
id: PropTypes.string.isRequired,
label: PropTypes.string,
onChange: PropTypes.func,
upperCaseOnly: PropTypes.bool,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
};
export default class UppercaseTextField extends Component {
constructor(props) {
super();
this.state = { value: props.value };
this.onChange = () => this.onChange();
}
onChange(e) {
let value = e.target.value;
if (this.props.upperCaseOnly) {
value = value.toUpperCase();
}
this.setState({ value });
this.props.onChange(e);
}
render() {
return (
<FormGroup controlId={id}>
<ControlLabel>{this.props.label}</ControlLabel>
<FormControl
type="text"
onChange={this.onChange}
defaultValue={this.props.value}
value={this.state.value}
/>
</FormGroup>
);
}
}
UppercaseTextField.propTypes = propTypes;
最初安装时,props.value通常(尽管并非总是)设置为''。这使React 15感到不满意,因为value =''会使值被丢弃,因此React认为这是不受控制的输入,即使它具有onChange也是如此。
该组件有效,但是我不喜欢在控制台中收到此警告:
警告:FormControl正在将文本类型的受控输入更改为
不受控制。输入元素不应从受控切换为
不受控制(反之亦然)。决定使用受控还是
组件生命周期中不受控制的输入元素。更多
信息:http://facebook.github.io/react/docs/forms.html#controlled-components
在0.14.x中可以正常工作,没有任何警告,但是现在15似乎不喜欢它。我如何清理它以保留功能但摆脱警告?
最佳答案
确保在安装时未定义this.state.value
。您可以通过设置this.state = {value: props.value || ''};
或将props.value
设置为必需属性来在构造函数中执行此操作。