Передача функции установки состояния ребенку не является плохой практикой, это полностью приемлемо. Фактически, я бы сказал, что делать это:
const MyComponent = () => {
const [state, setState] = useState();
return <Child onStateChange={setState} />
}
const Child = React.memo(() => {...});
лучше, чем
const MyComponent = () => {
const [state, setState] = useState();
return <Child onStateChange={(value) => setState(value)} />
}
const Child = React.memo(() => {...});
, потому что в первом примере компонент Child
не перерисовывается всякий раз, когда MyComponent
рендерится. Во втором примере всякий раз, когда MyComponent
выполняет рендеринг, он воссоздает пользовательскую функцию установки состояния, которая заставляет компонент Child
выполнять рендеринг без необходимости. Чтобы избежать этого, вам нужно было бы обернуть свою пользовательскую функцию установки в React.useCallback
, чтобы предотвратить ненужные повторные рендеринг, который является просто еще одним произвольным слоем хуков.