Проверяет, что состояние не устанавливается во время рендера безусловно: это запускает дополнительные рендеры и может привести к бесконечному циклу рендера.
Безусловный вызов setState во время рендера запускает ещё один рендер до того, как текущий завершится. Получается бесконечный цикл, и приложение падает.
// ✅ Derive during renderfunctionComponent({items}){constsorted=[...items].sort();// Just calculate it in renderreturn<ul>{sorted.map(/*...*/)}</ul>;}// ✅ Set state in event handlerfunctionComponent(){const[count,setCount]=useState(0);return(<buttononClick={()=>setCount(count+1)}>{count}</button>);}// ✅ Derive from props instead of setting statefunctionComponent({user}){constname=user?.name||'';constemail=user?.email||'';return<div>{name}</div>;}// ✅ Conditionally derive state from props and state from previous rendersfunctionComponent({items}){const[isReverse,setIsReverse]=useState(false);const[selection,setSelection]=useState(null);const[prevItems,setPrevItems]=useState(items);if(items!==prevItems){// This condition makes it validsetPrevItems(items);setSelection(null);}// ...}
Частая проблема — попытка «поправить» состояние после рендера. Допустим, счётчик не должен превышать проп max:
1 2 3 4 5 6 7 8 91011121314
// ❌ Wrong: clamps during renderfunctionCounter({max}){const[count,setCount]=useState(0);if(count>max){setCount(max);}return(<buttononClick={()=>setCount(count+1)}>{count}</button>);}
Как только count превысит max, запустится бесконечный цикл.
Чаще эту логику лучше перенести в событие — туда, где состояние устанавливается в первый раз. Например, максимум можно проверять в момент обновления состояния:
1 2 3 4 5 6 7 8 910
// ✅ Clamp when updatingfunctionCounter({max}){const[count,setCount]=useState(0);constincrement=()=>{setCount(current=>Math.min(current+1,max));};return<buttononClick={increment}>{count}</button>;}
Теперь сеттер выполняется только в ответ на клик, React нормально завершает рендер, и count никогда не переходит за max.
В редких случаях состояние нужно поправить по данным из предыдущих рендеров. Тогда следуйте этому паттерну условной установки состояния.