[英]How to re-render after state has changed
在 React 中,我正在使用 Kendo 网格。 我有一个充满 state 数组的网格,如下所示:
const [tempAtributi, setTempAtributi] = useState([]);
// ...
const MyCommandCell = (props) => {
const indexObj = tempAtributi.findIndex(
(e) => e.atribut_id === props.dataItem.atribut_id
);
const Remove = () => {
if (indexObj > -1) {
const lista = tempAtributi;
lista.splice(indexObj, 1);
setTempAtributi(lista);
}
};
return (
<td className="k-command-cell">
<Button
className="k-button k-button-md k-rounded-md k-button-solid k-button-solid-base k-grid-remove-command"
onClick={() => Remove()}
>
<FaTrash /> Remove
</Button>
</td>
);
};
const Cell = (props) => <MyCommandCell {...props} />;
useEffect(() => {
(async () => {
try {
const resAtr = await services.getTemplateAtributi(
state.data.sn_template_id
);
setTempAtributi(resAtr.data.rlista);
} catch (e) {
console.log(e);
}
})();
}, []);
//...
return (
<>
<Grid data={tempAtributi}>
<GridColumn field="name" title="Atribut" filter="text" />
<GridColumn cell={CommandCell} title="remove" filter="text" />
</Grid>
</>
);
因此,在渲染时,我在 useEffect 中调用 API 并用对象数组填充 tempAtributi state。 我的网格已满。 之后,我有一列删除,您可以在其中单击和 onClick,检查该属性是否在对象的 tempAtributi 数组内。 如果是,我用 object 减去已删除的 object 的数组更新 tempAtributi state。 完成删除后,我必须单击确认调用 API 并将 tempAtributi state 设置为更新/新值(如果我在单击确认后调用 services.getTemplateAtributi,我将获得更新值):
<Button themeColor={"primary"} style={{marginTop:'2%', marginRight:'2%'}} onClick={() => Confirm()}>
Confirm
</Button>
如果我单击删除一次或多次(无需确认)一切正常,如果我控制台记录 state,它还没有删除 object,但问题是我仍然可以在网格中看到 object,即使它是不再在 tempAtributi state 中。 我想在单击 remmove 后刷新网格,以便该行不存在。我不知道如何在删除后刷新网格,因为如果我调用 useEffect,它将调用 API 并将其设置为乞讨值。 需要帮助!
我的第一个猜测是删除深层 object 副本。 由于 JavaScript 中的克隆对象与它们紧密相关。 你可以用一个简单的例子来测试它:
const a = { b: { c: 'd' } } }
const b = a
b.b.c = 'e'
console.log(a, b)
正如您所注意到的,a 和 b 具有相同的值,但我们只改变了其中一个。 您可以使用b = JSON.parse(JSON.stringify(a))
这种关系,这是最常见的方法。
因此,在您的示例中,您的 delete function 应如下所示:
const Remove = () => {
if (indexObj > -1) {
const deepCopy = JSON.parse(JSON.stringify(tempAtributi));
deepCopy.splice(indexObj,1);
setTempAtributi(deepCopy);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.