Rules Hub
Code Ruleset
Rule priority, scope & exceptions
Use this to align rules with the senior-level structure (P0/P1/P2, scope, exceptions/tradeoffs).
Use ref cleanup supported by the target React version
Match ref-callback cleanup to the supported React version; returned cleanup is supported from React 19.
Bad example
| 1 | // React 18 and earlier |
| 2 | <div ref={node => { |
| 3 | if (!node) return; |
| 4 | node.addEventListener("click", onClick); |
| 5 | return () => node.removeEventListener("click", onClick); |
| 6 | }} /> |
Explanation (EN)
In React 18 and earlier, a returned ref cleanup is not executed.
Objašnjenje (HR)
U Reactu 18 i starijem vraćeni cleanup ref callbacka ne izvršava se.
Good example
| 1 | const [node, setNode] = useState<HTMLDivElement | null>(null); |
| 2 | useEffect(() => { |
| 3 | if (!node) return; |
| 4 | node.addEventListener("click", onClick); |
| 5 | return () => node.removeEventListener("click", onClick); |
| 6 | }, [node, onClick]); |
| 7 | return <div ref={setNode} />; |
Explanation (EN)
This effect-based variant supports older React and cleans up the specific previous node and handler when either changes.
Objašnjenje (HR)
Varijanta s effectom podržava stariji React te čisti prethodni konkretni čvor i handler kada se bilo koji promijeni.
Notes (EN)
Check the minimum supported React version before choosing ref cleanup. React 19 supports a returned cleanup; earlier versions require another teardown mechanism.
Exceptions / Tradeoffs (EN)
React 19 callback cleanup is valid, including for node replacement. An effect must track the actual attached node and every reactive handler it reads.
Iznimke / Tradeoffi (HR)
React 19 podržava cleanup callbacka refa, uključujući zamjenu čvora. Effect mora pratiti stvarno priključeni čvor i svaki reaktivni handler koji čita.