在输入内输入时反应阻止表单提交

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)

  • @TroyCosentino其他原因:在第一个`e =&gt; { e.preventDefault(); 这是一个匿名函数,每个渲染循环都会重新创建,因此 React 会在子元素中替换它。使用专用处理程序,函数实例仅创建一次,然后保持不变。 (4认同)

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,无论你想怎么称呼它)。

  • 按键已弃用 https://developer.cdn.mozilla.net/en-US/docs/Web/API/Element/keypress_event (2认同)
  • v 17.0.1 中键盘事件的 React 事件列表为: onKeyDown onKeyPress onKeyUp 请参阅 https://reactjs.org/docs/events.html#keyboard-events 我不知道这些事件是否被填充为未弃用的内容。还没有研究过这个。但 onKeyDown 或 onKeyUp 应该适用于大多数用途,在我上面的示例中。 - 谢谢 (2认同)

小智 9

这对我有用:

<Input
   ...
   onKeyDown={(e) => { e.key === 'Enter' && e.preventDefault() }}
/>
Run Code Online (Sandbox Code Playgroud)


Dav*_*mer 5

我不确定这是否适用于每种情况,因为当您在表单的输入字段中按Enter键时,尽管默认的提交不会发生,但您仍然会触发onSubmit方法。这意味着您仍将触发为表单设计的伪提交操作。一种带有ES6的衬板,可以专门,完全地解决该问题:

<input onKeyPress={(e)=>{e.target.keyCode === 13 && e.preventDefault();}} />
Run Code Online (Sandbox Code Playgroud)

该解决方案应具有0个副作用,并直接解决问题。

  • 我的解决方案在很多情况下都可以正常工作,这会使某人落在这里。许多人会尝试上述解决方案,只是发现它阻止了表单每个部分的回车键。在您希望其他功能继续默认运行的情况下,越具体越好。**如果您不想触发表单提交形式的单个输入或组件,这是唯一可行的解​​决方案**。其他方法将显式禁用enter按钮或显式禁用html5标准提交,但不会执行要求的操作。 (3认同)
  • 对我来说, e.target.keyCode 未定义,但 e.key === 'Enter' 效果很好。 (2认同)

小智 5

正如 Eon 所建议的,防止 ENTER 的最佳方法是将以下内容添加到您的输入元素中

onKeyPress={(e) => { e.key === 'Enter' && e.preventDefault(); }}
Run Code Online (Sandbox Code Playgroud)

  • 按键已弃用 https://developer.cdn.mozilla.net/en-US/docs/Web/API/Element/keypress_event (2认同)