我做了一个删除,该删除使用react可以很好地工作。问题是删除后,我想将状态设置为新的extraitMP3以刷新并在删除后自动显示结果。这是删除的功能:
showDeleteConfirmation(value, id,idJson,thisHandler) {
confirm({
title: 'Voulez vous supprimer cette audio ?',
content: '',
okText: 'Oui, je confirme',
okType: 'danger',
cancelText: 'Non',
onOk() {
deleteMp3Request(id);
var {extraitMP3} = thisHandler.state;
Object.keys(extraitMP3).map(ids => {
return(
Object.keys(extraitMP3[ids].TypeMp3List).splice(idJson, 1)
)
})
thisHandler.setState({extraitMP3: extraitMP3})
console.log('extraitMP3',extraitMP3)
NotificationManager.success("le fichier audio est supprimé avec succès !", "");
},
onCancel() {
},
});
}
这是我正在映射的JSON:
这也是我的回报
return (
<div>
{loader ? <CircularProgress className="gx-loader-400" /> : Object.keys(extraitMP3).map(ids => {
return (
<Card>
<li key={ids}>
<Card styleName="gx-card-list icon icon-data-display gx-mr-2 gx-text-blue gx-fs-xl">
<div className="gx-media-body">
{extraitMP3[ids].Typenom}
{extraitMP3[ids].TypeIcon != null &&
displayIcon(extraitMP3[ids].TypeIcon)
}
</div>
{Object.keys(extraitMP3[ids].TypeMp3List).map(idJson => {
return (
<div className="gx-main-content gx-mb-4">
<ContainerHeader match={this.props.match} />
<div className="gx-contact-item gx-dragndrop-item">
<DragHandle />
<div className="gx-col gx-job-title ">
{extraitMP3[ids].TypeMp3List[idJson].intitule}
</div>
{extraitMP3[ids].TypeMp3List[idJson].interpretation1Icon !== '' &&
<Tooltip title={extraitMP3[ids].TypeMp3List[idJson].interpretation1Nom}>
{displayIcon(extraitMP3[ids].TypeMp3List[idJson].interpretation1Icon)}
</Tooltip>
}
{extraitMP3[ids].TypeMp3List[idJson].interpretation2Icon !== '' &&
<Tooltip title={extraitMP3[ids].TypeMp3List[idJson].interpretation2Nom}>
{displayIcon(extraitMP3[ids].TypeMp3List[idJson].interpretation2Icon)}
</Tooltip>
}
{extraitMP3[ids].TypeMp3List[idJson].interpretation3Icon !== '' &&
<Tooltip title={extraitMP3[ids].TypeMp3List[idJson].interpretation3Nom}>
{displayIcon(extraitMP3[ids].TypeMp3List[idJson].interpretation3Icon)}
</Tooltip>
}
{extraitMP3[ids].TypeMp3List[idJson].langueIcon !== '' &&
<div className="gx-col gx-job-title gx-d-sm-flex gx-text-truncate gx-px-8">
<Tooltip title={extraitMP3[ids].TypeMp3List[idJson].langueNom}>
<i className={`flag flag-24 gx-mr-2 ${extraitMP3[ids].TypeMp3List[idJson].langueIcon}`} />
</Tooltip>
</div>
}
<div className="gx-col gx-job-title gx-d-sm-flex gx-text-truncate gx-px-8">
<Select
showSearch
style={{ width: '100%' }}
placeholder="Selection la choix de votre numéro de téléphone "
optionFilterProp="children"
onChange={handleChangeSelect}
defaultValue={selectOptions.get(extraitMP3[ids].TypeMp3List[idJson].visibilite)}
filterOption={(input, Option) => Option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}
>
{[...selectOptions].map(([value, label]) => <Option value={value}> {label} </Option>)}
</Select>
</div>
<div className="gx-col gx-job-title gx-d-sm-flex gx-text-truncate gx-px-8">
<i className="icon icon-edit gx-fs-xl gx-text-gris" />
</div>
<div className="gx-col gx-job-title gx-d-sm-flex gx-text-truncate gx-px-8">
<span className="gx-pointer">
<i className="icon icon-trash gx-pointer gx-text-danger gx-fs-xxl"
id={extraitMP3[ids].TypeMp3List[idJson].id}
onClick={e => this.showDeleteConfirmation(e.target.value, extraitMP3[ids].TypeMp3List[idJson].id,idJson,this)} />
</span>
</div>
</div>
</div>
)
})}
<NotificationContainer/>
<Button type="primary" htmlType="submit" labelCol={{ xs: 24, sm: 5 }} wrapperCol={{ xs: 24, sm: 12 }}>
Enregistrer
</Button>
</Card>
</li>
</Card>
)
}) }</div>
)
任何帮助将不胜感激。
答案 0 :(得分:1)
问题是您要修改的数组没有保留在任何地方,它是Object.keys(extraitMP3[ids].TypeMp3List)
创建的数组,除非您将其保存在某个地方,否则这是临时的。
如果目标是从idJson
中删除名称为extraitMP3[ids]
的属性,则:
showDeleteConfirmation(value, id,idJson,thisHandler) {
confirm({
title: 'Voulez vous supprimer cette audio ?',
content: '',
okText: 'Oui, je confirme',
okType: 'danger',
cancelText: 'Non',
onOk() {
deleteMp3Request(id);
// *** Changes start here ***
thisHandler.setState(
// Update callback
({extraitMP3: oldExtraitMP3}) => {
// Clone the object we're changing
const extraitMP3 = {...oldExtraitMP3};
// Clone the subobject we're changing and remember it
const entry = extraitMP3[ids] = {...extraitMP3[ids]};
// Remove that property from the cloned subobject
delete entry[isJson];
// Return the new object with the changes
return {extraitMP3};
},
// State change completion callback
() => {
// (Or if you don't want to wait for the state change to complete, you could
// just put this after the setState call, not in a completion callback
NotificationManager.success("le fichier audio est supprimé avec succès !", "");
}
);
// *** Changes end here ***
},
onCancel() {
},
});
}
请注意,在setState
回调中进行状态更改很重要,您不能进行更改,然后使用结果调用setState
,因为<如果您要根据当前状态更新状态,则需要使用回调表单,因为state updates are asynchronous可能会被批量处理。 (否则,您可能会使用陈旧状态进行更新。)
答案 1 :(得分:-1)
您可以使用对setState
的callBack。
thisHandler.setState({extraitMP3: extraitMP3}, () => {
console.log('extraitMP3',extraitMP3)
NotificationManager.success("le fichier audio est supprimé avec succès !", "");
})