Use when a React component loses state when switching between tabs/views in a tabbed interface. Common symptoms: - Reading/generation state disappears when navigating away from a tab - "Generate" button shows even though data was just generated - SSE streams die when switching tabs - No auto-loading of cached data on return to tab
&&: {showTab && <Component>} unmounts the component completelyChange from conditional rendering to CSS visibility:
// BEFORE (unmounts on tab switch):
{viewMode === "transits" && <TransitBodygraphPanel />}
// AFTER (stays mounted, state survives):
<div style={{ display: viewMode === "transits" ? "block" : "none" }}>
<TransitBodygraphPanel />
</div>
Add an effect that fetches saved data on mount and when key params change:
useEffect(() => {
let cancelled = false;
async function checkCache() {
const keyParams = { natalFp, localDate, timeZone, dayAnchorPolicy };
try {
const res = await fetch(`/api/endpoint/latest?${new URLSearchParams(keyParams)}`);
if (!cancelled) {
if (res.ok) {
const data = await res.json();
setReading(data.reading);
setSections(data.sections);
setReadingChecked(true);
} else {
setReadingChecked(true); // No cache, show generate button
}
}
} catch {
if (!cancelled) setReadingChecked(true);
}
}
checkCache();
return () => { cancelled = true; };
}, [natalFp, localDate, timeZone, dayAnchorPolicy]);
Add a readingChecked state (starts as false) and show loading UI while checking:
if (!readingChecked) {
return <div className="empty-state">Checking for saved reading...</div>;
}
if (!reading) {
return <div className="empty-state">Nothing runs until you click generate</div>;
}
If backend tracks "generating" status, re-subscribe to SSE stream:
if (savedReading?.status === "generating") {
// Re-connect to /subscribe/[id] to resume streaming
subscribeToGeneration(savedReading.id);
}
/latest endpoint requires exact match on model/engine/prompt - either pass them or ensure defaults matchuseRef to track subscription handles for cleanup