UseEffect Реагировать крючок будет работать переданный в функции при каждом изменении. Это можно оптимизировать, чтобы он вызывался только при изменении желаемых свойств.
Что делать, если я хочу вызвать функцию инициализации из componentDidMount
и не вызывать ее снова при изменениях? Допустим, я хочу загрузить объект, но функция загрузки не нуждается в данных из компонента. Как мы можем сделать это с помощью useEffect
крючка?
class MyComponent extends React.PureComponent {
componentDidMount() {
loadDataOnlyOnce();
}
render() { ... }
}
С крючками это может выглядеть так:
function MyComponent() {
useEffect(() => {
loadDataOnlyOnce(); // this will fire on every change :(
}, [...???]);
return (...);
}
javascript
reactjs
react-hooks
Давид Мольнар
источник
источник
TL; DR
useEffect(yourCallback, [])
- вызовет обратный вызов только после первого рендера.Детальное объяснение
useEffect
запускается по умолчанию после каждого рендеринга компонента (таким образом вызывая эффект).При размещении
useEffect
в вашем компоненте вы сообщаете React, что хотите запустить обратный вызов в качестве эффекта. React запустит эффект после рендеринга и после обновления DOM.Если вы передаете только обратный вызов - обратный вызов будет выполняться после каждого рендеринга.
При передаче второго аргумента (массива) React будет запускать обратный вызов после первого рендеринга и каждый раз, когда один из элементов в массиве изменяется. например, при размещении
useEffect(() => console.log('hello'), [someVar, someOtherVar])
- обратный вызов будет выполняться после первого рендера и после любого рендеринга, который один изsomeVar
илиsomeOtherVar
будет изменен.Передавая второй аргумент пустой массив, React будет сравнивать после каждого рендеринга массив и будет видеть, что ничего не изменилось, вызывая обратный вызов только после первого рендеринга.
источник
хук useMountEffect
Запуск функции только один раз после монтирования компонентов является настолько распространенным шаблоном, что он оправдывает собственную ловушку, которая скрывает детали реализации.
Используйте его в любом функциональном компоненте.
О хуке useMountEffect
При использовании
useEffect
со вторым аргументом массива React будет запускать обратный вызов после монтирования (начального рендеринга) и после изменения значений в массиве. Поскольку мы передаем пустой массив, он будет работать только после монтирования.источник
useMount
когда вашей функции эффекта нужно что-то из реквизита, но никогда не нужно запускать снова, даже если это значение изменяется без предупреждения linter:useEffect(()=>console.log(props.val),[])
будет отсутствовать предупреждение о зависимости, ноuseMount(()=>console.log(props.val))
не вызовет предупреждение, но «работает». Я не уверен, будет ли проблема с параллельным режимом все же.В качестве второго аргумента передайте пустой массив
useEffect
. Это эффективно говорит React, цитируя документы :Вот фрагмент, который вы можете запустить, чтобы показать, что он работает:
источник
Мне нравится определять
mount
функцию, она обманывает EsLint таким же образомuseMount
, и я нахожу это более понятным.источник
Хитрость в том, что useEffect принимает второй параметр.
Второй параметр - это массив переменных, которые компонент проверит, чтобы убедиться, что он изменился перед повторным рендерингом. Вы можете поставить здесь все, что хотите, и указать, что вы хотите проверить.
Или ничего не ставить
Это обеспечит запуск useEffect только один раз.
Примечание из документов:
Если вы используете эту оптимизацию, убедитесь, что массив включает в себя все значения из области компонента (например, реквизиты и состояние), которые меняются со временем и используются эффектом. В противном случае ваш код будет ссылаться на устаревшие значения из предыдущих рендеров.
источник