Компонент изменяет неконтролируемый ввод текста типа для управления ошибкой в ReactJS

  Предупреждение: компонент изменяет неконтролируемый ввод текста типа для управления. Входные элементы не должны переключаться с неуправляемых на управляемые (или наоборот). Выберите между использованием контролируемого или неконтролируемого элемента ввода в течение срока службы компонента. * Мой код:

constructor(props) {
  super(props);
  this.state = {
    fields: {},
    errors: {}
  }
  this.onSubmit = this.onSubmit.bind(this);
}

....

onChange(field, e){
  let fields = this.state.fields;
  fields[field] = e.target.value;
  this.setState({fields});
}

....

render() {
  return(
    <div className="form-group">
      <input
        value={this.state.fields["name"]}
        onChange={this.onChange.bind(this, "name")}
        className="form-control"
        type="text"
        refs="name"
        placeholder="Name *"
      />
      <span style={{color: "red"}}>{this.state.errors["name"]}</span>
    </div>
  )
}

Ответ 1

Причина в том, что вы определили:

this.state = { fields: {} }

поля как пустой объект, поэтому при первом рендеринге this.state.fields.name будет undefined, а поле ввода получит значение как:

value={undefined}

Из-за этого входное поле станет неконтролируемым.

Когда вы вводите какое-либо значение на входе, fields в состоянии меняются на:

this.state = { fields: {name: 'xyz'} }

И в это время поле ввода преобразуется в контролируемый компонент, поэтому вы получаете ошибку:

Компонент изменяет неконтролируемый ввод текста типа, который нужно контролировать.

Возможные решения:

1- Определите fields в состоянии как:

this.state = { fields: {name: ''} }

2- Или определите свойство value, используя оценку короткого замыкания следующим образом:

value={this.state.fields.name || ''}   // (undefined || '') = ''

Ответ 2

Сначала установите текущее состояние ...this.state

Это потому, что когда вы собираетесь назначить новое состояние, оно может быть неопределенным. так что это будет исправлено путем установки состояния извлечения текущего состояния также

this.setState({...this.state, field})

Если в вашем состоянии есть объект, вы должны установить состояние следующим образом, предположим, что вы должны установить имя пользователя внутри объекта пользователя.

this.setState({user:{...this.state.user, ['username']: username}})

Ответ 3

ПРОСТО, сначала нужно установить начальное состояние

Если вы не установите начальное состояние, реакция будет восприниматься как неконтролируемый компонент.

Ответ 4

Изменение value на defaultValue разрешит это.