[英]React - How do I manage the state of multiple dynamically created controlled inputs?
[英]Manage multiple form inputs and it's value via React state
让我从一个例子开始,以便你们知道问题是什么以及我想要实现的目标。
在我的项目中,我将在同一页面上拥有多个用户表单,并且表单的数量将是动态的(取决于用户数,如果有3个用户,则有3个表单,如果有10个用户,则有10个表单,依此类推)。
假设所有表单都有3个字段(在这里保持简单),例如firstName , middleName , lastName 。
现在,假设我们有3个用户,那么3个输入将出现在页面上。
<form>
<input type="text" name="firstName" value="" />
<input type="text" name="middleName" value="" />
<input type="text" name="lastName" value="" />
</form>
这次我们有3个用户,因此以上表格将出现3次。 实际上,我为所有3个用户仅采取了一种形式。 我所做的如下所示。
<form>
for (let i = 1; i <= 3; i++) {
<input type="text" name="firstName" value="" />
<input type="text" name="middleName" value="" />
<input type="text" name="lastName" value="" />
}
<input type="submit" value="Submit">Apply</button>
</form>
当用户提交表单时,我需要每个表单字段的值数组。
我想要什么和如何获得结果如下。
['tome hanks','shahrukh khan','john'] //所有3位用户的名字
['tome hanks','shahrukh khan','john'] //所有3位用户的中间名
['tome hanks','shahrukh khan','john'] //所有3位用户的姓氏
我已经尝试过本教程,但并不是我真正需要的。
也许我可以使用React状态来实现,但是不知道如何?
如果Redux有帮助,那么对我来说很好。
class App extends React.Component { constructor(props) { super(props); this.state = { users: [ { firstName: 'John1', middleName: 'Daniel1', lastName: 'Paul1' }, { firstName: 'John2', middleName: 'Daniel2', lastName: 'Paul2' }, { firstName: 'John3', middleName: 'Daniel3', lastName: 'Paul3' }, { firstName: 'John4', middleName: 'Daniel4', lastName: 'Paul4' }, ], }; } _onChangeUser = (index, field, event) => { const newValue = event.target.value; this.setState(state => { const users = [ ...state.users.slice(0, index), { ...state.users[index], [field]: newValue, }, ...state.users.slice(index + 1), ]; return { users, }; }); }; _onSubmit = event => { event.preventDefault(); // Do something with this.state.users. console.log(this.state.users); }; render() { return ( <div className="App"> <form onSubmit={this._onSubmit}> {this.state.users.map((user, index) => ( <div key={index}> <input value={user.firstName} onChange={this._onChangeUser.bind(this, index, 'firstName')} /> <input value={user.middleName} onChange={this._onChangeUser.bind(this, index, 'middleName')} /> <input value={user.lastName} onChange={this._onChangeUser.bind(this, index, 'lastName')} /> </div> ))} <button type="submit">Submit</button> </form> </div> ); } } ReactDOM.render( <App />, document.getElementById('root') );
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script> <div id="root"><div>
好。 将状态变量声明为数组。 以下应满足您的要求。
constructor(props){
super(props)
this.state={
firstNameArray:[],
middleNameArray:[],
lastNameArray:[],
fName:” “,
mName:””,
lName:””
}
this.changeFirstName = this.changeFirstName.bind(this);
this.changeMiddleName= this.changeMiddleName.bind(this);
this.changeLastName=this.changeLastName.bind(this);
}
changeFirstName(event){
this.setState({
firstNameArray:event.target.value,
fName: event.target.value
})
changeMiddleName(event){
this.setState({
middleNameArray: event.target.value,
mName: event.target.value
})
}
changeLastName(event){
this.setState({
lastNameArray: event.target.value,
lName: event.target.value
})
如下所示在输入字段上调用每个函数
<input type=‘text’ name=‘fName’ value= {this.state.fName} onChange={this.changeFirstName} />
对其他两个输入字段也以相同的方式进行。 希望这能回答您的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.