Ern*_*Kev 23 javascript reactjs
按下Enter键时,React阻止表单提交
我有以下React Search Bar组件,父容器可以在其中调用
<SearchBar onInputChange={this.handleInputChange} />
Run Code Online (Sandbox Code Playgroud)
每次用户更改输入时,都会通知父容器.这就是我的搜索栏不需要任何提交按钮的原因.
但是,我发现如果我在搜索栏中按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
Run Code Online (Sandbox Code Playgroud)
zer*_*kms 29
您需要创建一个表单处理程序,以防止默认的表单操作.
最简单的实现是:
<form onSubmit={e => { e.preventDefault(); }}>
Run Code Online (Sandbox Code Playgroud)
但理想情况下,您为此创建一个专用处理程序:
<form onSubmit={this.submitHandler}>
Run Code Online (Sandbox Code Playgroud)
具有以下实现
submitHandler(e) {
e.preventDefault();
}
Run Code Online (Sandbox Code Playgroud)
eon*_*eon 29
在一个带有搜索输入字段的 React 组件中,嵌套在一个更大的(非 React OR React)表单中,这对我来说最适合跨浏览器:
<MyInputWidget
label="Find"
placeholder="Search..."
onChange={this.search}
onKeyPress={(e) => { e.key === 'Enter' && e.preventDefault(); }}
value={this.state.searchText} />
Run Code Online (Sandbox Code Playgroud)
(e)=>{e.target.keyCode === 13}(@DavidKamer 的回答)不正确:您不想要event.target.That's the input field。你想要事件本身。在 React(目前特别是 16.8)中,你想要event.key(e.key,无论你想怎么称呼它)。
小智 9
这对我有用:
<Input
...
onKeyDown={(e) => { e.key === 'Enter' && e.preventDefault() }}
/>
Run Code Online (Sandbox Code Playgroud)
我不确定这是否适用于每种情况,因为当您在表单的输入字段中按Enter键时,尽管默认的提交不会发生,但您仍然会触发onSubmit方法。这意味着您仍将触发为表单设计的伪提交操作。一种带有ES6的衬板,可以专门,完全地解决该问题:
<input onKeyPress={(e)=>{e.target.keyCode === 13 && e.preventDefault();}} />
Run Code Online (Sandbox Code Playgroud)
该解决方案应具有0个副作用,并直接解决问题。
小智 5
正如 Eon 所建议的,防止 ENTER 的最佳方法是将以下内容添加到您的输入元素中:
onKeyPress={(e) => { e.key === 'Enter' && e.preventDefault(); }}
Run Code Online (Sandbox Code Playgroud)