Это более общий способ, которым React использует событие ввода onChange
.С React вы хотите где-то сохранять значение вашего ввода в каком-либо состоянии, будь то состояние компонента или глобальное хранилище, такое как Redux.Ваше состояние и пользовательский интерфейс должны всегда синхронизироваться.Из-за этого событие onChange
запускается для каждого введенного / удаленного символа, так что вы можете обновить это состояние, чтобы отразить новое значение.Входы, написанные таким образом, называются контролируемыми компонентами, и вы можете прочитать о них больше и посмотреть некоторые примеры на https://reactjs.org/docs/forms.html.
. При этом вы можете определить, когда пользователь покидает вход с помощью события onBlur
, хотяЯ бы не рекомендовал использовать это для обновления состояния со значением, так как вы увидите, что контролируемый компонент будет действовать только для чтения, если вы не обновите состояние в событии onChange
.Вам придется использовать неконтролируемый компонент, обычно устанавливая начальное значение с defaultValue
вместо value
и усложняя для себя вещи.
// CORRECT IMPLEMENTATION
class ControlledForm extends React.Component {
constructor(props, context) {
super(props, context);
this.state = {
name: 'example'
};
this.handleNameChange = this.handleNameChange.bind(this);
}
handleNameChange(e) {
this.setState({
name: e.target.value
});
}
render() {
return (
<div>
<h1>Controlled Form</h1>
<input type="text" value={this.state.name} onChange={this.handleNameChange} />
<p>{this.state.name}</p>
</div>
);
}
}
// INPUT DOES NOT WORK
class BuggyUncontrolledForm extends React.Component {
constructor(props, context) {
super(props, context);
this.state = {
name: 'example'
};
}
render() {
return (
<div>
<h1>Buggy Uncontrolled Form</h1>
<input type="text" value={this.state.name} />
<p>{this.state.name}</p>
</div>
);
}
}
// NOT RECOMMENDED
class UncontrolledForm extends React.Component {
constructor(props, context) {
super(props, context);
this.state = {
name: 'example'
};
this.handleNameChange = this.handleNameChange.bind(this);
}
handleNameChange(e) {
this.setState({
name: e.target.value
});
}
render() {
return (
<div>
<h1>Uncontrolled Form</h1>
<input type="text" defaultValue={this.state.name} onBlur={this.handleNameChange} />
<p>{this.state.name}</p>
</div>
);
}
}
ReactDOM.render(
<div>
<ControlledForm />
<BuggyUncontrolledForm />
<UncontrolledForm />
</div>
, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>