如何在React 15中创建一个空的默认值的受控输入

时间:2016-05-11 23:50:00

标签: reactjs react-bootstrap

我想要控制文本输入有问题,但它需要支持空值。这是我的组成部分:

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通常(但并非总是)设置为&#39;&#39;。这使得React 15不高兴,因为价值=&#39;&#39;使值降低,因此React认为它是一个不受控制的输入,即使它有一个onChange。

该组件有效,但我不想在控制台中收到此警告:

  

警告:FormControl正在更改文本类型的受控输入   不受控制。输入元素不应从受控切换到   不受控制的(反之亦然)。决定使用受控制的还是   组件寿命的不受控制的输入元素。更多   信息:http://facebook.github.io/react/docs/forms.html#controlled-components

这在0.14.x中运行良好,没有任何警告,但现在15似乎不喜欢它。如何清理它以保持功能但摆脱警告?

1 个答案:

答案 0 :(得分:12)

确保在安装时未定义this.state.value。您可以通过设置this.state = {value: props.value || ''};或将props.value设为必需属性来在构造函数中执行此操作。