Не удается ввести текстовое поле ввода React

Я пытаюсь мой первый бит реагировать.js и am зашли в тупик рано... У меня есть код ниже, который отображает форму поиска в <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* но я просто пытаюсь получить эту работу.)

4 ответов


на

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

вы не правильно cased ваш onchange собственность. Это должно быть onChange - попробуйте это и посмотрите, вызывает ли он теперь обработчик.

обновление, так как этот вопрос имеет много мнений и предоставление немного дополнительного контекста является ценным:

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

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


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

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

и onchange должно быть onChange как указывает @davnicwil.


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

пример:

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

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

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


у меня также есть такая же проблема, и в моем случае я ввел редуктор правильно, но все же я не мог ввести поле. Оказывается, если вы используете 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. смотрите это вопрос