Подтвердить что ты не робот

Невозможно ввести текстовое поле React input

Я пытаюсь выполнить свой первый бит React.js, и я наступил раньше... У меня есть код ниже, который отображает форму поиска в <div id="search"></div>. Но ввод в поле поиска ничего не делает.

Предположительно что-то пропало, пропуская реквизит и состояние вверх и вниз, и это похоже на общую проблему. Но я в тупике - я не вижу, чего не хватает.

var SearchFacet = React.createClass({
  handleChange: function() {
    this.props.onUserInput(
      this.refs.searchStringInput.value
    )
  },
  render: function() {
    return (
      <div>
        Search for:
        <input
          type="text"
          value={this.props.searchString}
          ref="searchStringInput"
          onchange={this.handleChange} />
      </div>
    );
  }
});

var SearchTool = React.createClass({
  render: function() {
    return (
      <form>
        <SearchFacet 
          searchString={this.props.searchString}
          onUserInput={this.props.onUserInput}
         />
        <button>Search</button>
      </form>
    );
  }
});

var Searcher = React.createClass({
  getInitialState: function() {
    return {
      searchString: ''
    }
  },

  handleUserInput: function(searchString) {
    this.setState({
      searchString: searchString
    })
  },

  render: function() {
    return (
      <div>
        <SearchTool 
          searchString={this.state.searchString}
          onUserInput={this.handleUserInput}
        />
      </div>
    );
  }
});

ReactDOM.render(
  <Searcher />,
  document.getElementById('searcher')
);

(В конце концов у меня будут другие типы SearchFacet*, но я просто пытаюсь заставить это работать.)

4b9b3361

Ответ 1

Вы не правильно onchange свою опору onchange на input. Это должно быть onChange в JSX.

<input
  type="text"
  value={this.props.searchString}
  ref="searchStringInput"
  onchange={this.handleChange} <--[should be onChange]
/>  

Тема передачи value prop в <input>, а затем каким-то образом изменить значение, передаваемое в ответ на взаимодействие с пользователем с помощью обработчика onChange довольно хорошо рассмотрена в документации.

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

Всякий раз, когда вы устанавливаете value prop input на некоторую переменную, у вас есть контролируемый компонент. Это означает, что вы должны изменить значение переменной некоторыми программными средствами, иначе ввод всегда будет содержать это значение и никогда не изменится, даже когда вы печатаете - собственное поведение ввода, чтобы обновить его значение при вводе, переопределяется Реагируйте здесь.

Итак, вы правильно берете эту переменную из состояния, и у вас есть обработчик для обновления состояния, все настроено нормально. Проблема была в том, что у вас есть onchange а не правильный onChange обработчик никогда не вызывался, и поэтому value никогда не обновлялось при вводе во ввод. Когда вы используете onChange обработчик, value обновляется при onChange, и вы видите ваши изменения.

Ответ 2

Использование value={whatever} приведет к тому, что вы не сможете ввести поле ввода. Вы должны использовать defaultValue="Hello!".

См. https://facebook.github.io/react/docs/uncontrolled-components.html#default-values

Кроме того, onchange должен быть onchange, как указывает @davnicwil.

Ответ 3

Это может быть вызвано тем, что функция onChange не обновляет правильное значение, указанное во входных данных.

Пример:

<input type="text" value={this.state.textValue} onChange = {this.changeText}></input>

 changeText(event){
        this.setState(
            {textValue : event.target.value}
        );
    }

в функции onChange обновите указанное поле значения.

Ответ 4

У меня тоже такая же проблема, и в моем случае я правильно ввел редуктор, но все же я не мог вводить поле. Оказывается, если вы используете immutable, вы должны использовать redux-form/immutable.

import {reducer as formReducer} from 'redux-form/immutable';
const reducer = combineReducers{

    form: formReducer
}
import {Field, reduxForm} from 'redux-form/immutable';
/* your component */

Обратите внимание, что ваше состояние должно быть как state->form, иначе вам нужно явно настроить библиотеку, и имя для состояния должно быть form. см. этот issue