Я пробую свою первую часть 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*
но я просто пытаюсь заставить работать этот.)
javascript
reactjs
Фил Гайфорд
источник
источник
this
когда вы вводите текстовое поле. Возможно,this
это уже неSearcher
компонент.this
в каком месте кода ведется лог ? Пытаюсь войтиSearcher.handleUserInput()
илиSearchFacet.handleChange()
ничего не делает.Ответы:
Вы не поместили свою
onchange
опору в корпусinput
. Это должно бытьonChange
в JSX.Тема передачи
value
опоры в объект<input>
и последующего изменения значения, передаваемого в ответ на взаимодействие с пользователем с помощьюonChange
обработчика, довольно хорошо рассматривается в документации .Они относятся к таким входам как контролируемые компоненты и относятся к входам, которые вместо этого позволяют модели DOM изначально обрабатывать входные значения и последующие изменения от пользователя как неконтролируемые компоненты .
Всякий раз, когда вы устанавливаете
value
опоруinput
некоторой переменной, у вас есть управляемый компонент . Это означает, что вы должны изменить значение переменной какими-то программными средствами, иначе вход всегда будет содержать это значение и никогда не изменится, даже когда вы печатаете - собственное поведение входа, чтобы обновить его значение при вводе, переопределяется от React здесь.Итак, вы правильно берете эту переменную из состояния и имеете обработчик для обновления состояния, все настроено нормально. Проблема заключалась в том, что у вас есть,
onchange
а не правильныйonChange
обработчик, который никогда не вызывался, и поэтомуvalue
никогда не обновлялся при вводе ввода. Когда вы используетеonChange
обработчик будет вызван,value
будет обновляться при вводе, и вы увидите изменения.источник
Использование
value={whatever}
приведет к тому, что вы не сможете вводить текст в поле ввода. Вам следует использоватьdefaultValue="Hello!"
.См. Https://facebook.github.io/react/docs/uncontrolled-components.html#default-values.
Кроме того,
onchange
должно быть,onChange
как указывает @davnicwil.источник
value={whatever}
иvalue={this.state.myvalue}
. Вместо этого я должен был сделать это уточнение : использованиеonChange={this.handleChange}
и что-нибудь подобноеhandleChange: function(e) { var newState = {}; newState[e.target.name] = e.target.value; this.setState(newState); },
снова делает поля изменяемыми.defaultValue
спасла меня.Это может быть вызвано тем, что функция onChange не обновляет правильное значение, указанное во входных данных.
Пример:
в функции onChange обновите указанное поле значения.
источник
У меня также есть такая же проблема, и в моем случае я правильно ввел редуктор, но все же я не мог ввести поле. Оказывается, если вы используете,
immutable
вы должны использоватьredux-form/immutable
.Обратите внимание, что ваше состояние должно быть таким, как
state->form
иначе, вы должны явно настроить библиотеку, а также имя для состоянияform
. увидеть эту проблемуисточник
Для меня следующее простое изменение сработало отлично
источник
В контексте компонента класса ...
Если метод changeHandler - обычная функция:
его можно использовать вот так ...
onChange={(e)=>this.handleChange(e)}
Если метод changeHandler является стрелочной функцией:
его можно использовать вот так ...
onChange={this.handle}
И это решило мою проблему «Не могу ввести текст в поле ввода React».
источник