reactjs React TypeScript onSubmit e.preventDefault()不工作

dgiusagp  于 2023-04-20  发布在  React
关注(0)|答案(5)|浏览(137)

我正在使用React和TypeScript构建一个简单的用户搜索应用程序。我有一个基本的表单,其中包含一个用于搜索用户的输入文本框和一个用于提交搜索的输入按钮。但是我的onSubmit方法中的e.preventDefault()方法似乎不起作用。当我提交时,整个应用程序刷新。实际上,可能根本没有调用onSubmit

private handleSubmit = (e: React.FormEvent<HTMLInputElement>) => {
    e.preventDefault();
    this.props.searchUsers(this.state.text);
    this.setState({text: ''});
  }

  private handleChange = (e: React.FormEvent<HTMLInputElement>) => {
    this.setState({text: e.currentTarget.value});
  }

  public render() {
    return (
      <div>
        <form className="form">
          <input 
            type="text" 
            name="text" 
            value={this.state.text} 
            placeholder="Search Users..."
            onChange={this.handleChange}
          />
          <input 
            type="submit"
            value="search"
            className="btn btn-dark btn-block" 
            onSubmit={this.handleSubmit}
          />
        </form>
      </div>
    );
  }

有什么建议吗?谢谢!

mwg9r5ms

mwg9r5ms1#

您在错误的位置添加了onSubmit
你应该在form中添加,而不是在按钮中。

public render() {
    return (
      <div>                    // \/ added here
        <form className="form" onSubmit={this.handleSubmit}>
          <input 
            type="text" 
            name="text" 
            value={this.state.text} 
            placeholder="Search Users..."
            onChange={this.handleChange}
          />
          <input                 // removed from the button
            type="submit"
            value="search"
            className="btn btn-dark btn-block" 
          />
        </form>
      </div>
    );
  }

如果您查看文档中的示例,您会看到他们将其添加到form中。

  • 请记住,要触发formonSubmit,您的input/button需要具有type="submit"
ffscu2ro

ffscu2ro2#

你可以简单地这样做:

private handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
    e.preventDefault();
    this.props.searchUsers(this.state.text);
    this.setState({text: ''});
  }

  private handleChange = (e: React.FormEvent<HTMLInputElement>) => {
    this.setState({text: e.currentTarget.value});
  }

  public render() {
    return (
      <div>
        <form className="form"   onSubmit={(e) =>this.handleSubmit(e)}>
          <input 
            type="text" 
            name="text" 
            value={this.state.text} 
            placeholder="Search Users..."
            onChange={this.handleChange}
          />
          <input 
            type="submit"
            value="search"
            className="btn btn-dark btn-block" 
          
          />
        </form>
      </div>
    );
  }
p4tfgftt

p4tfgftt3#

另外,除了将事件从onClick移动到onSubmit之外,要从表单中获取事件,请输入React。FormEvent works。

private handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
    e.preventDefault();
    this.props.searchUsers(this.state.text);
    this.setState({text: ''});
  }```

Instead of e:React.FormEvent<HTMLInputElement>
zujrkrfu

zujrkrfu4#

我通过从handleSubmit函数中删除e.preventDefault并在button上添加**onClick={e => {e.preventDefault(); this.handleSubmit()}}**来修复类似的问题。

private handleSubmit = (e: React.FormEvent<HTMLInputElement>) => {
    this.props.searchUsers(this.state.text);
    this.setState({text: ''});
  }
  public render() {
    return (
      <div>
        <form onSubmit={this.handleSubmit} className="form">
          <input 
            type="text" 
            name="text" 
            value={this.state.text} 
            placeholder="Search Users..."
            onChange={this.handleChange}
          />
          <input 
            type="submit"
            value="search"
            className="btn btn-dark btn-block" 
            onClick={e => {e.preventDefault(); this.handleSubmit()}}
          />
        </form>
      </div>
    );
  }

这是测试和应该工作。

vsnjm48y

vsnjm48y5#

const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
        e.preventDefault()
    }

return (
    <form onSubmit={e => handleSubmit(e)}>
            <label>Name</label>
            <input type="text" placeholder='John Doe'/>

            <label>Email</label>
            <input type="email" placeholder='example@doamin.com'/>

            <input type="submit"/>
    </form>
)

相关问题