React-Mobx警告:组件正在更改不受控制的输入

时间:2018-06-06 08:33:44

标签: reactjs typescript mobx

我使用React + TypeScript + Mobx。我用输入创建了表单,一切正常,但是浏览器出错了。我做错了什么?

  

警告:组件正在更改要控制的文本类型的不受控制的输入。输入元素不应从不受控制切换到受控制(或反之亦然)。决定在组件的生命周期内使用受控或不受控制的输入元素。

形式:

@observer
export class SearchForm extends React.Component {

    @observable
    private _inputText: string;

    submitForm = (event: SyntheticEvent<HTMLFormElement>) => {
    event.preventDefault();
    }

    render() {
      return (
        <form onSubmit={this.submitForm}>
          <InputField
            value={this._inputText}
            onChange={action((value: string) => this._inputText = value)}
          />
       </form>
    );}}

输入:

interface Props {
  value: string;
  onChange: (inputText: string) => void;
}

@observer
export class InputField extends React.Component<Props> {

  onChange = (event: SyntheticEvent<HTMLInputElement>) => {
  this.props.onChange(event.currentTarget.value);
  }

  render() {
    return (
      <div>
        <input
          type="text"
          value={this.props.value}
          onChange={this.onChange}
        />
     </div>
   );
 }
}

1 个答案:

答案 0 :(得分:2)

根据输入值prop的存在来控制/不控制React的输入。您传递了价值道具,但_inputTextundefined开头。当输入的值开始未定义时,React将始终以不受控制的模式启动输入。

输入输入后,_inputText不再是未定义的,并且输入翻转到受控模式,您会收到警告。

对于您的情况,修复很简单;只需将_inputText初始化为空字符串:

@observable
private _inputText: string = '';

你也可以调整你的<InputField />来强制未定义的值道具为空字符串:

  render() {
    return (
      <div>
        <input
          type="text"
          value={this.props.value == null ? '' this.props.value}
          onChange={this.onChange}
        />
     </div>
   );
 }