const submit = useCallback((el) => () => { log(el); }, []); arr.map(el => <button onClick={submit(el)} />) arr.map(el => <SomeComp key={} onClick={() => submit(el)} />) const param = useMemo(() => ({c: a + b}), [a,b]) return <Child value={param} /> Child = React.memo(() => {})
Answer from AI
sobes.tech AI
В этом коде есть несколько моментов, связанных с оптимизацией и правильным использованием React хуков:
-
useCallback((el) => () => { log(el); }, [])— здесь создаётся функция, которая возвращает другую функцию с замыканием наel. Но зависимостей нет, значитelбудет всегда первый или undefined, что неправильно. -
В
arr.map(el => <button onClick={submit(el)} />)—submit(el)вызывается сразу при рендере, а не при клике. Нужно передавать функцию, а не результат вызова. -
В
arr.map(el => <SomeComp key={} onClick={() => submit(el)} />)— здесь правильно создаётся функция-обёртка, ноkeyпустой, что вызовет предупреждения. Ключ должен быть уникальным. -
useMemo(() => ({c: a + b}), [a,b])— создаёт мемоизированный объект, чтобы не создавать новый объект при каждом рендере, еслиaиbне изменились. -
Child = React.memo(() => {})— мемоизация компонента, чтобы он не перерендеривался без необходимости.
Итог:
submitдолжен приниматьelи возвращать функцию, но зависимости должны быть корректны.- В
onClickнельзя вызывать функцию сразу, нужно передавать функцию-обработчик. - Ключи должны быть уникальными.
useMemoиReact.memoпомогают оптимизировать рендеры.
Пример исправления:
const submit = useCallback((el) => () => { log(el); }, []);
arr.map(el => <button key={el.id} onClick={submit(el)} />)
// или
arr.map(el => <SomeComp key={el.id} onClick={() => submit(el)()} />)
const param = useMemo(() => ({c: a + b}), [a,b]);
return <Child value={param} />;
const Child = React.memo(({value}) => { /* ... */ });