React предотвращает отправку формы при нажатии enter внутри ввода

React предотвратить подачу формы при нажатии enter

у меня есть следующий компонент React Search Bar, где родительский контейнер может вызывать с помощью

<SearchBar onInputChange={this.handleInputChange} />

каждый раз, когда пользователь изменяет вход, родительский контейнер будет уведомлен. Вот почему в моей строке поиска не нужна кнопка отправки.

тем не менее, я обнаружил, что если я нажму enter в строке поиска, вся страница обновится. А я этого не хочу.

Я знаю, если у меня есть кнопку в форме я мог бы назвать event.preventDefault (). Но в этом случае у меня нет кнопки, поэтому я не знаю, что здесь делать

class SearchBar extends Component {
    constructor(props) {
        super(props);
        this.state = { value: '' };
        this.handleChange = this.handleChange.bind(this)
    }

    handleChange(e) {
        this.setState({ value: e.target.value });
        this.props.onInputChange(e.target.value);
    }

    render() {
        return (
        <div id="search-bar">
            <form>
            <FormGroup controlId="formBasicText">
                <FormControl
                type="text"
                onChange={this.handleChange}
                value={this.state.value}
                placeholder="Enter Character Name"
                />          
            </FormGroup>
            </form>
        </div>
        );
    }
}

export default SearchBar

2 ответов


вам нужно создать обработчик формы, который предотвратит действие формы по умолчанию.

самая простая реализация может быть:

<form onSubmit={e => { e.preventDefault(); }}>

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

<form onSubmit={this.submitHandler}>

со следующей реализацией

submitHandler(e) {
    e.preventDefault();
}

Я не уверен, что это работает для каждой ситуации, так как при нажатии enter в поле ввода формы вы все равно вызовете метод onSubmit, хотя отправка по умолчанию не произойдет. Это означает, что вы все равно инициируете псевдо-действие отправки, которое вы разработали для своей формы. Один лайнер с ES6, который решает проблему конкретно и полностью:

<input onKeyPress={(e)=>{e.target.keyCode === 13 && e.preventDefault();}} />

Это решение должно иметь 0 побочных эффектов и решает проблему напрямую.