【发布时间】:2021-01-23 23:28:13
【问题描述】:
我无法调试这种情况。我正在尝试从 API 提供的数组中删除索引。在检查其父级的道具更改后,我将其存储在父级状态中。这里一切都很好。我可以在父表单状态中存储任何道具更改。
父表单映射 templateData 中的所有内容,我确定它是什么类型,然后根据需要渲染组件。
删除按钮将始终仅位于 DynamicInputGroup 中,因此我通过道具将该功能向下传递。在 DynamicInputGroup 中,我需要映射从父级传递的数组,然后映射该数组中的对象以显示每个单独的输入。再次使用传递下来的道具来确定要渲染的输入,与父级相同。
这就是问题所在。当我单击删除时,假设索引 5 中的第 2 个,我看到该索引在状态中被删除,但呈现的是索引 5 被删除。我不确定如何解决这个问题。我已经完成了研究并阅读了密钥发挥作用?我试图将渲染函数中的变量设置为状态,以便刷新,但没有。最后一个索引总是被删除。哈!
父表单
this.state = {
templateData: []
}
removeGroupItem = (index, inputName ) => {
let group = `${inputName}__group`
const newState = this.state;
if (index === -1) return;
newState.templateData[group].splice(index, 1);
console.log(newState) // THIS SHOWS CORRECT STATE
this.setState(newState);
}
render() {
return (
{Object.keys(this.state.templateData).map((name, key) => {
let data = { // SETTING inputType TO DISPLAY CORRECT COMPONENT }
return (
<Fragment key={key}>
{data.inputType == 'input' && <DynamicTextInput {...data} />}
{data.inputType == 'rtf' && <DynamicRTF {...data} />}
{data.inputType == 'img' && <DynamicImageUpload {...data} />}
{data.inputType == 'group' && <DynamicInputGroup {...data} removeGroupItem={this.removeGroupItem} />} // COMPONENT THAT HOLDS REMOVE BUTTON
</Fragment>
)
})}
)
}
DynamicInputGroup 组件
this.state = {
value: []
}
componentDidMount() {
this.setState({ value: this.props.value })
}
componentDidUpdate(prevProps) {
if (this.props.value !== prevProps.value) {
this.setState({
value: this.props.value
})
}
}
render() {
return (
<Fragment>
<Typography>{this.props.inputName}</Typography>
{this.state.value.map((value, key) => {
return (
<span>
{Object.keys(value).map((input, index) => {
let data = { // SETTING inputType TO DISPLAY CORRECT COMPONENT }
return (
<Grid key={index}>
{data.inputType == 'input' && <DynamicTextInput {...data} />}
{data.inputType == 'rtf' && <DynamicRTF {...data} />}
{data.inputType == 'img' && <DynamicImageUpload {...data} />}
{data.inputType == 'group' && <DynamicInputGroup {...data} />}
</Grid>
)
})}
{key >= 1 ? <span onClick={() => this.props.removeGroupItem(key, this.props.inputName)}>remove</span> : ''}
</span>
)
})}
</Fragment>
)
}
然后,如果需要 DynamicTextInput
const DynamicTextInput = (props) => {
return (
<Grid>
<TextField
name={props.inputName} label={props.inputName} defaultValue={props.value}
size="small" variant="outlined" fullWidth multiline
/>
</Grid>
)
}
【问题讨论】:
标签: javascript arrays reactjs state slice