Проверяет, что компоненты статичны и не создаются заново при каждом рендере. Компоненты, которые создаются динамически, могут сбрасывать состояние и вызывать лишние повторные рендеры.
Компоненты, объявленные внутри других компонентов, создаются заново на каждом рендере. React видит каждый из них как совершенно новый тип компонента: размонтирует старый, монтирует новый и при этом уничтожает всё состояние и узлы DOM.
// ❌ Component defined inside componentfunctionParent(){constChildComponent=()=>{// New component every render!const[count,setCount]=useState(0);return<buttononClick={()=>setCount(count+1)}>{count}</button>;};return<ChildComponent/>;// State resets every render}// ❌ Dynamic component creationfunctionParent({type}){constComponent=type==='button'?()=><button>Click</button>:()=><div>Text</div>;return<Component/>;}
Компоненты иногда объявляют внутри, чтобы получить доступ к локальному состоянию:
1 2 3 4 5 6 7 8 91011121314
// ❌ Wrong: Inner component to access parent statefunctionParent(){const[theme,setTheme]=useState('light');functionThemedButton(){// Recreated every render!return(<buttonclassName={theme}>Clickme</button>);}return<ThemedButton/>;}
Вместо этого передавайте данные пропсами:
1 2 3 4 5 6 7 8 910111213
// ✅ Better: Pass props to static componentfunctionThemedButton({theme}){return(<buttonclassName={theme}>Clickme</button>);}functionParent(){const[theme,setTheme]=useState('light');return<ThemedButtontheme={theme}/>;}
Примечание
Если хочется объявлять компоненты внутри других компонентов, чтобы достать локальные переменные, это знак, что вместо этого нужно передавать пропсы. Так компоненты проще переиспользовать и тестировать.