#javascript #reactjs
#javascript #reactjs
Вопрос:
У меня есть компонент, который должен отправляться, когда пользователь нажимает enter или нажимает кнопку. Важно то, что пользователь будет ожидать, что сможет использовать Enter для отправки этой формы, а кнопка отправки действительно предназначена только тогда, когда они заметят, что она есть, и решат нажать кнопку.
Моя проблема в том, что у меня есть настройка формы и все такое, и мой обработчик отправки работает должным образом, но, похоже, я вообще не могу захватить клавишу ввода для этого!
сначала у меня есть функция отправки следующим образом:
onSubmit(e) {
e.preventDefault();
this.state.socket.emit('message', this.state.message);
console.log('emitted');
this.setState(
{
message: '',
},
() => {
// e.target.value = '';
console.log('state should be cleared.');
},
);
}
и моя форма выглядит так:
<Form>
<FormGroup>
<div className="chatBoxRow2">
<input
type="text"
name="message"
onChange={this.onChange}
value={this.state.message}
className="chatBoxOut"
/>
<Button className="chatBoxButton" onClick={this.onSubmit}>
Send
</Button>
</div>
</FormGroup>
</Form>
Я пытался сделать это с помощью решения, найденного здесь: react-redux формирует проблему с github.
но безрезультатно, я все равно получаю обновленную страницу…..
Комментарии:
1. Вам нужно будет добавить обработчик
keydown
событий дляdocument
проверяемогоevent.which(13)
.2. почему onSubmit находится на кнопке? Используйте обработчик отправки в форме
3. @epascarello просто мой обычный. Не все, что «должно быть»
4. Хороший момент. Возможно, я до сих пор неправильно понимал событие отправки
5. обычно пользователи будут вводить ввод правильно, поэтому слушайте
onKeyUp
,evt.which
чтобы получить код ключа
Ответ №1:
Слушайте onSubmit
в форме, а не onclick
на кнопке. По умолчанию кнопки имеют тип «отправить», поэтому нажатие на нее или нажатие «Ввод» внутри текстового поля отправит вашу форму.
<Form onSubmit={this.onSubmit}>
<FormGroup>
<div className="chatBoxRow2">
<input
type="text"
name="message"
onChange={this.onChange}
value={this.state.message}
className="chatBoxOut"
/>
<Button className="chatBoxButton">
Send
</Button>
</div>
</FormGroup>
</Form>
Ответ №2:
Реорганизуйте это:
<Form>
<FormGroup>
<div className="chatBoxRow2">
<input
type="text"
name="message"
onChange={this.onChange}
value={this.state.message}
className="chatBoxOut"
/>
<Button className="chatBoxButton" onClick={this.onSubmit}>
Send
</Button>
</div>
</FormGroup>
</Form>
в это:
Отправить
Итак, откуда я handleSubmit
взялся? Ну, если вы сделаете console.log(this.props);
здесь:
render() {
console.log(this.props);
return (
<Form onSubmit={this.props.handleSubmit(this.onSubmit)}>
<FormGroup>
<div className="chatBoxRow2">
<input
type="text"
name="message"
onChange={this.onChange}
value={this.state.message}
className="chatBoxOut"
/>
<button className="chatBoxButton">Send</button>
</div>
</FormGroup>
</Form>
)
}
Вы обнаружите, что внутри этого props
объекта с помощью Redux Form существует огромное количество свойств, в частности, вызывается handleSubmit
одно, которое является функцией, которую мы должны вызывать в любое время, когда ваша форма отправляется и предоставляется Redux Form.
Хорошо, но почему не просто onSubmit={this.onSubmit}
? Короткий ответ заключается в том, что теперь вы используете Redux Form.
Этот новый процесс вызова onSubmit={this.props.handleSubmit(this.onSubmit)}
изменит способ onSubmit
вызова.
Поэтому вместо:
onSubmit(event) {
event.preventDefault();
}
Теперь вы можете сделать:
onSubmit(formValues) {
}
Вы видите, что вам больше не нужно иметь дело с event
объектом, вместо этого он будет вызываться со всеми значениями из вашей формы. Таким handleSubmit
образом, обрабатывается event.preventDefault()
за кулисами, оставляя наш onSubmit()
обратный вызов вызываться с formValues
помощью .