【问题标题】:What's the best way to get textbox values on button click in React?在 React 中单击按钮时获取文本框值的最佳方法是什么?
【发布时间】:2019-05-12 11:48:34
【问题描述】:

通常在 HTML 中你会这样做:

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

我相信这不是 React 的做法。

另一种方式,就像我在我的应用程序中所做的那样,并不是我认为的最佳方式。 像这样:

buttonclickRequest(){
  var reasonn = document.getElementById("testControl").value;
}

<div>
   <FormControl id="testControl"/>
   <Button id="btnRequest" onClick={this.buttonclickRequest}/>
</div>

在其他 stackoverflow 主题中,我看到了这样的示例:

constructor(props) {
  super(props);
  this.state = {
    firstName: '',
    lastName: '',
    place: '',
    address: '',
    email: '',
    phoneNumber: ''
  };
}
handleClick() {
  //do something
}

handleChange = (e) => {
  this.setState({
     [e.target.id]: e.target.value
  })
}

<div>
   <input type="text" onChange={e => this.handleChange(e)}/>
   <button type="submit" onClick={this.handleClick}/>
</div>

但我现在也有我的问题,

我不知道如何正确输入多个文本:

  1. 您可以制作多个效率低下的特定变更处理程序,

  2. 您可以制作一个带有开关的changehandler来设置属性

对输入字段进行句柄更改是否更有效?因为我只想要单击按钮时的输入字段值..

这就是我所说的形式。

那么当点击按钮时,如何使用 React 正确获取多个输入数据呢?

提前感谢您的帮助!

【问题讨论】:

  • textbox 创建一个组件。它维护自己的状态并在值更改时进行回调。您的父组件可以管理所有子组件状态,因为回调将传递给文本框组件
  • 如果您更改一些代码,它是高效的。每次您在输入中输入内容(箭头函数)时,您当前都在创建一个新函数。相反,您可以这样做:&lt;input type="text" id="username" onChange={this.handleChange} /&gt;.
  • found this link 使用 setTimeout 和 Cleartimeout

标签: javascript reactjs react-native react-state-management react-state


【解决方案1】:

假设您可能正在寻找状态值

constructor(props) {
  super(props);
  this.state = {
    firstName: '',
    lastName: '',
    place: '',
    address: '',
    email: '',
    phoneNumber: ''
  };
}
handleClick() {
  console.log("State ==>", this.state);
}

setFirstName = (e) => {
  this.setState({
     firstName: e.target.value
  })
}

setPhoneNumber = (e) => {
  this.setState({
     phoneNumber: e.target.value
  })
}

render(){
return('
<div>
   <label> First Name </label>
   <input type="text" name="firstName" onChange={e => this.setFirstName(e)}/>
   <label> Phone Number </label>
   <input type="text" name="phoneNumber" onChange={e => this.setPhoneNumber(e)}/>
   <button type="submit" onClick={this.handleClick}/>
</div>
')
}

【讨论】:

  • 这非常低效,并迫使您为每个输入编写更多代码。 OP 示例是提高效率的方法。请参阅我对 OP 帖子的评论,了解为什么他的代码没有性能。
  • 但这确实像 SkyzohKey 所说的那样,只要我输入一个字符就会改变状态。尽管我只需要在按下按钮时检索它。
  • 而且确实要写很多代码,我不想写
  • 如果您尝试维护可能需要传递给其他组件的状态值,则最好维护其键,而不管输入字段的 id 是什么。另外,您还可以将它们保存在全局状态中,而不是使用本地状态。
【解决方案2】:

是的...您是正确的为每个输入创建更改处理程序效率不高在您的情况下,您需要的是一个反应表单,它可以为您提供旧的并提交选项,您不能使用旧表单,因为它需要更新页面以检索值。

我建议你使用 Antd form 给你所有的组件,我什至建议你使用他们的 Input 组件,它看起来非常漂亮并且处理得很好。 Antd Design (React 的用户界面组件) - Antd 一些示例代码。 试一试 !!! CodeSandbox

【讨论】:

  • 您不需要 React 表单管理器来管理 6 个文本字段。您需要的只是性能。这不是 6 个 onChange 处理程序会杀死你的性能。不可能同时为多个字段触发 onChange 所以...... OP 犯的唯一错误是,只要他在文本字段中写入内容,就创建一个新的箭头函数。
  • 是的,你是对的,它不会影响性能,这不是问题,但为什么不促进更好的编程!这不是用户填写的一种情况输入,它是一种表单,当所有的填写完毕并添加验证时,您需要最后的值?基本上就是表单多字段的定义……
  • 在用户类型时设置状态的好处是您实际上可以进行实时表单验证。此外,一旦用户单击按钮,您基本上可以获得this.state 并从那里获取值。我不明白在项目中增加复杂性如何有助于“促进更好的编程”。代码越少越好。
  • 你们俩都有很好的论据,谢谢!让我重新思考正确的方向
  • 有了表单,你可以实时验证表单,我认为它并不复杂......代码将很容易阅读,否则将不得不寻找eatch setstate,展位是解决方案,也许搜索一下你需要,但那是一种形式
【解决方案3】:

我认为首先您应该在输入字段中添加name 属性并使用名称设置状态,然后使用handleClick 上的状态:

constructor(props) {
  super(props);
  this.state = {
    firstName: '',
    lastName: '',
    place: '',
    address: '',
    email: '',
    phoneNumber: ''
  };
}
handleClick = () => {
  //do something
  console.log(this.state);
  // should be something like this {
  //  firstName: '',
  //  lastName: '',
  //  place: '',
  //  address: '',
  //  email: '',
  //  phoneNumber: ''
  //}
}

handleChange = (e) => {
  this.setState({
    [e.target.name]: e.target.value
  })
}

render() {
  return(
    <div>
      <input type="text" name="firstName" onChange={this.handleChange}/>
      <input type="text" name="lastName" onChange={this.handleChange}/>
      <button type="submit" onClick={this.handleClick}/>
    </div>
  )
}

请注意,名称应与状态键匹配。

【讨论】:

  • 这确实有效,谢谢,但这是最有效的方法吗?因为每次添加一个字符都会调用onChange函数。
  • 我认为是,每个字符都调用 onChange 不是什么大问题
猜你喜欢
  • 1970-01-01
  • 2020-11-10
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
相关资源
最近更新 更多