Есть ли проблема с производительностью, связанная с использованием функции стрелки в React Effect Hook?

React представила хуки в своем последнем предложении. Эффектный хук принимает функцию и такой массив:

useEffect(() => {
    document.title = `${unRead} notifications`
}, [unRead])

React преднамеренно использует функцию стрелки. Это означает, что при каждом вызове хука эффекта создается новая функция.

Влияет ли это на производительность, учитывая тот факт, что компонент может иметь много обработчиков эффектов?

введите здесь описание изображения


person lomse    schedule 30.11.2018    source источник
comment
Лучше всего сравнить и выяснить. Тем не менее, я на 90% уверен, что V8 сможет кэшировать эту функцию с помощью входных и возвращаемых сигнатур.   -  person Jimmy Breck-McKye    schedule 30.11.2018


Ответы (1)


Это означает, что при каждом вызове хука эффекта создается новая функция.

Итак, создается новый массив [unRead]. Это не проблема ни для массива, ни для функции. Как и другие объекты, функции в современных JS-движках создаются очень быстро. Влияние вновь созданной функции на производительность незначительно.

При повторном использовании функции могут быть некоторые улучшения производительности, в зависимости от движка:

// outside a component
const effect = () => {...};

...
// inside a component
useEffect(effect);

vs

useEffect(() => {...});

Но поскольку эффекты часто полагаются на объемлющую область (например, состояние useState), повторное использование функций эффектов может быть нецелесообразным.

Что касается функций стрелок, разницы в производительности между стрелочными и обычными функциями не ожидается, хотя у стрелок могут быть проблемы с производительностью в некоторых движках (например, в старых версиях Firefox).

Влияет ли это на производительность, учитывая тот факт, что компонент может иметь много обработчиков эффектов?

Если функция компонента вызывается достаточно часто, чтобы вызвать проблемы с производительностью, это и есть настоящая проблема.

person Estus Flask    schedule 30.11.2018