【问题标题】:How to get a value of an input (text) field without document.getElementById('..')如何在没有 document.getElementById('..') 的情况下获取输入(文本)字段的值
【发布时间】:2020-04-20 09:45:17
【问题描述】:

我有一个用 React 编写的 web 应用程序。我有一个映射(!)组件,它代表一个状态数组。这是映射的子组件:

<div className="summarized_content_div">
                    <ul>
                        <li>Benutzername: <input id='inputBenutzername' type="text" defaultValue={this.props.benutzername}/></li>
                        <li>Vorname: <input id='input_vorname' type="text" defaultValue={this.props.vorname}/></li>
                        <li>Nachname: <input id='input_nachname' type="text" defaultValue={this.props.nachname}/></li>
                        <li>E-Mail: <input id='input_email' type="text" defaultValue={this.props.email}/></li>
                        <li>Letzter Login: <input id='input_letzter_login' type="text" defaultValue={this.props.letzter_login}/></li>
                        <li>Status: <input id='input_status' type="text" defaultValue={this.props.status}/></li>
                        <input id="speichern" className="button" type="button" value="Speichern"/><input id="löschen" className="button" type="button" value="Löschen"/>
                    </ul>
                </div>

现在我希望在单击按钮时将输入字段(input_benutzername、input_vorname...)的值传递给父组件。我可以这样做:

const value = document.getElementById('whatever').value

然后用那个值做一些事情。

...但正如我所说,那些组件是映射的,所以它总是传递第一个映射组件的值,因为它搜索具有此 id 的第一个元素(我猜)。

所以我的最后一个问题是,如何在不使用 getElementById 的情况下获取输入字段的值,因为这不起作用。

谢谢你的帮助

编辑:

这是父组件:

doSomethingWithTheValues = (values) => {
...
}


...
<Route path="/verwaltung/benutzer">
                            <div>
                                {this.props.benutzer.map((benutzer, index) => {
                                    return <BenutzerItem
                                        index={index}
                                        key={benutzer.id}
                                        id={benutzer.id}
                                        benutzername={benutzer.benutzername}
                                        vorname={benutzer.vorname}
                                        nachname={benutzer.nachname}
                                        email={benutzer.email}
                                        letzter_login={benutzer.letzter_login}
                                        status={benutzer.status}
                                    />
                                })}
                            </div>
                        </Route>

【问题讨论】:

  • 您的意思是在您的应用/组件中有多个具有相同 ID 的元素吗?
  • 是的,也许我也应该改变它:)
  • 这是在 React.js 中吗
  • 你应该先解决这个问题。一个 ID 只能使用一次 :)
  • 是的,这就是问题所在。 ID 应该在 DOM 中是唯一的,在您的情况下,您应该使用类,并在按钮单击时使用 DOM 遍历查找相应的元素。请使用codesandbox.io为此创建small demo。这可能有助于其他人调试并提供对此的更多见解

标签: javascript reactjs input parameters


【解决方案1】:

输入字段在 React.js 中是这样编码的:

 class Componentname extends React.Component {
 constructor(props) {
 super(props);
 this.state = {value: ''};

 this.handleChange = this.handleChange.bind(this);
 this.handleSubmit = this.handleSubmit.bind(this);
 }

 handleChange(event) {
 this.setState({value: event.target.value});
 }

 handleSubmit(event) {
 alert('A name was submitted: ' + this.state.value);
 event.preventDefault();
 }

 render() {
  return (
   <form onSubmit={this.handleSubmit}>
     <label>
      Name:
      <input type="text" value={this.state.value} onChange={this.handleChange} 
     />
    </label>
    <input type="submit" value="Submit" />
  </form>
  );
 }
 }

【讨论】:

    【解决方案2】:

    我会这样做的方式是传递一个函数来处理更新:

    <ExampleForm 
        data={this.state.valuesForExampleForm}
        update={(key,newValue) => this.setState({key, newValue})}
        />
    

    然后在你的表单中你有:

    const data = this.props.data;
    // other code
    <li>Benutzername: <input defaultValue={data.benutzername} onChange={(e)=>this.props.update('benutzername', e.target.value)}/></li>
    

    小免责声明:我反应有点久了,可能有点不对劲。

    【讨论】:

    • @LeetProgramming 如果你想使用反应,那么你应该在组件中保存输入状态...useState 对于功能组件,阅读反应文档“处理事件”
    猜你喜欢
    • 1970-01-01
    • 2014-10-22
    • 2020-06-02
    • 1970-01-01
    • 2020-08-12
    • 2022-01-19
    • 1970-01-01
    • 2012-08-24
    • 2012-02-24
    相关资源
    最近更新 更多