I am facing a problem where calling forceUpdate on parent component doesn't re render the child component. I have attached the code snippets below.
PARENT COMPONENT
const forceUpdate = React.useReducer(() => ({}))[1];
const getAccountDetails = () => {
const opts = {
mailboxKey: details.getMailboxKey()
};
details.getAccountDetails(opts).then((response) => {
if (response.resp.data.lastSyncTime && response.resp.data.lastSyncTime !== -1) {
setLastSyncTime(response.resp.data.lastSyncTime);
if (response?.resp?.data?.ssi) {
details.set("ssi", response.resp.data.ssi);
}
if (response?.resp?.data?.fsi) {
details.set("fsi", response.resp.data.fsi);
}
}
details.set("isSyncCompleted", response.resp.data?.isSyncCompleted);
}).catch((ex) => {
succErrMsg(getI18N("ERROR"), {
severity: "error",
...succErrMsgOption
});
});
forceUpdate();
};
useEffect(() => {
getAccountDetails();
}, []);
const renderStatustable = () => {
const isSyncCompleted = details.getIsSyncCompleted();
if (isSyncCompleted) {
return <ImapSyncStatus {...{details}} />;
}
return <ImapFolderSyncStatus {...{details, getAccountDetails}} />;
};
return (showSyncStatusTable && renderStatustable())
CHILD COMPONENT ImapFolderSyncStatus.js
const [fsiData, setFsiData] = useState();
useEffect(() => {
setFsiData(details.getFolderSyncStatusInfo());
}, []);
function renderFolderSyncStatusRows () {
const rows = [];
for (const key in fsiData) {
if (Object.hasOwnProperty.call(fsiData, key)) {
const element = fsiData[key];
rows.push(
<Tr>
<Td>
{element.folderName}
</Td>
<Td>
{element.ci.ZCount}
</Td>
<Td>
{element.ci.mailCount}
</Td>
</Tr>
);
}
}
return rows;
}
return (<>
<ButtonColumn align="right">
<Button variant="flat" variantColor="primary" size="custom" onClick={getAccountDetails}>
<Icon className="rotate-right" />
{getI18N("Refresh folder")}
</Button>
</ButtonColumn>{renderFolderSyncStatusRows()}
</>);
As u can see, I am calling the parent getAccountDetails function from child. The function gets called correctly and forceUpdate is also triggered. However if I add breakpoint on the line const [fsiData, setFsiData] = useState(); and inside the useEffect in child component, only the former breakpoint is triggered. I solved this by adding a key to the child component but I don't understand what exactly is going on.