#reactjs
#reactjs
Вопрос:
function MyComponent() {
const handleSomething = (arg) => () => {
console.log(arg);
};
return (
<div>
<span onClick={handleSomething("Hello")}>Do something</span>
</div>
);
}
Я только что связался с вышеупомянутым синтаксисом thunk, и мне сказали, что он работает лучше, чем приведенный ниже код.
function MyComponent() {
return (
<div>
<span onClick={()=>{ console.log("Hello") }}>Do something</span>
</div>
);
}
Разве handleSomething не будет выполняться при каждом рендеринге, что добавляет дополнительный шаг?
Или, может быть, у компилятора есть какая-то умная оптимизация, которая делает thunk быстрее, чем встроенный?
Комментарии:
1. Повторный рендеринг происходит только при изменениях DOM. Определение функций в компоненте намного чище, чем их запись внутри шаблона JSX.
2. Я понимаю, что это чище и мне это нравится, но я не понимаю, как это может работать быстрее.
3. Компоненты React содержат код, а JSX содержит HTML с привязками данных. Именно так был разработан React. Почему написание функции в компоненте будет медленнее?
4. Поскольку функция thunk будет выполняться при визуализации компонента и возвращать другую функцию для onClick, при записи функции непосредственно внутри onClick пропускается выполнение handleSomething .
Ответ №1:
В компонентах класса просто используйте memoize:
import memoize from "lodash-es/memoize";
class MyComponent extends React.Component {
render() {
return (
<div>
<span onClick={handleSomething("Hello")}>Do something</span>
</div>
);
}
handleSomething = memoize(arg => () => {
console.log(arg);
});
}
Комментарии:
1. Я не знаком с Lodash, но функциональные компоненты имеют хуки useMemo и useCallback для запоминания, однако я не совсем понял концепцию и что именно она делает. В любом случае, этот вопрос больше касается однострочных недорогих функций, которые могут быть записаны непосредственно встроенными в обработчик onClick без ущерба для удобства чтения. Может быть, у компилятора есть какая-то умная оптимизация, которая делает thunk быстрее, чем встроенный?