【发布时间】:2019-01-08 14:56:09
【问题描述】:
我正在寻找一种最简洁的方法来处理表单中数百个动态创建的输入的输入更改。我遇到的问题是,当我从父组件传递一个处理程序时,该处理程序会在用户输入给定输入时更新父组件的状态对象,渲染输入中的新值变得缓慢且不稳定。
我还尝试在每个子组件的状态中使用单独的事件处理程序和“editValue”,并在用户点击提交按钮以更新其状态对象时将其发送给父级,但这似乎没有必要并且没有满足我的票证要求。
export default class Parent extends Component {
state = {
// Object will look like this with substantially more categories and input fields per category
inputFieldsData: {
personalInfo: {
allApproved: false,
inputs: {
name: {
approvalState: 'approved',
value: 'Joe Johnson',
},
email: {
approvalState: 'rejected',
value: 'jjohnson@gmail.com',
},
}
},
companyInfo: {
allApproved: true,
inputs: {
companyName: {
approvalState: 'approved',
value: 'ABC Inc.'
}
}
}
},
}
handleTextChange = (category, field, value) => {
this.setState((prevState) => {
const inputFieldsData = prevState.inputFieldsData;
inputFieldsData[category].inputs[field].value = value;
return { inputFieldsData };
});
}
render() {
return (
<div>
{
Object.keys(this.state.inputFieldsData).map((category) => {
<InputsTable
category={category}
handleTextSubmit={this.handleTextSubmit}
inputFieldsData={this.props.inputFieldsData} />
})
}
</div>
);
}
}
export default class InputsTable extends Component {
render() {
const category = this.props.category;
return (
<>
<table>
<tbody>
{
Object.keys(this.props.inputFieldsData[category]).map((input) => {
<Child
category={category}
value={this.props.inputFieldsData[category].inputs[input].value}
handleTextChange={this.props.handleTextChange} />
})
}
</tbody>
</table>
</>
);
}
}
export default class Child extends Component {
handleChange = (e) => {
this.props.handleTextChange(this.props.category, this.props.name, e.target.value);
}
render() {
return (
<tr>
<input
type="text"
value={this.props.value}
onChange={this.handleChange} />
</tr>
);
}
}
我希望父级中的 state 对象能够更新并将适当的 value prop 传递给每个输入,而不会在键入时出现任何断断续续的情况。
【问题讨论】:
标签: reactjs