Une mise à jour immuable consiste à ne jamais modifier l'état en place, mais à produire une nouvelle valeur : copie d'objet avec {...obj}, de tableau avec map, filter ou [...tab]. React compare les références pour décider de refaire le rendu, donc une mutation directe n'est pas détectée.
Exemple
setTodos(todos.map(t => t.id === id ? { ...t, fait: true } : t));