Прежде чем говорить о useffect.
Крюк, позвольте мне спросить вас: Вы когда-нибудь пытались сделать что-то вроде:
document.getElementById("someId").classList.add("someClass");
а потом выяснил, что реагирование теперь жаловалось TypeError: не удается прочитать свойство «Classlist» NULL
?
Ну, я наиболее наверняка имел.
Сначала я был бы как: « Что сейчас происходит? У меня есть элемент div с разумно
Просто прямо там !!! И тогда я бы понял: « AHA, RECT не закончил позиционирование всех моих HTML-элементов на странице еще. Это не знает о Div с разумно
все же. Итак, мой девл это ноль, чтобы реагировать. “
Теперь поговорим о Useffect ()
Отказ
Когда я думаю о Useffect ()
Я представляю, что это как первая дверь, которая реагирует, в тот момент, когда это делается с позиционированием всех элементов HTML на странице. И поэтому именно здесь мы должны поставить код, который мы хотим запустить сразу после этого, так что реагирование никогда не жалуется на недостающие элементы.
С момента реагирования каждый раз, когда изменение происходит с компонентом, он стучит/звонки Useffect ()
после каждого визуализации.
Самая простая структура Useffect
Похоже:
useEffect( ()=>{ // code to run after every render/re-render });
Давайте посмотрим простой пример.
import React {useState, useEffect} from 'react'; const App =()=> { let [circleBackgroundColor, setCircleBackgroundColor] = useState("lightblue"); useEffect(()=>{ // change the bg-color of the body after every render document.body.style.backgroundColor = getRandomColor(); }) const changeCircleBackgroundColor = ()=>{ // change the value of circleBackgroundColor setCircleBackgroundColor(getRandomColor()) } return() } const getRandomColor = ()=>{ return "#" + Math.random().toString(16).slice(2,8); }
Уведомление здесь, что BG-цвет Тело
Изменения не только на освежающих странице, но и на изменение цвета фона круга Div.
Почему это происходит?
Об обновлении страницы BG-цвет Тело
изменения, потому что React Callse useffect.
Сразу после первого визуализации.
На изменении BG-цвет круга Div BG-цвет Тело
изменения, потому что при изменении переменной состояния ОБРАЗБУЧКУБЛОКЛОР
Реагирование должно повторно рендерировать Приложение
. И после перевода, он называет Useffect
опять таки.
Но подожди, это даже эффективен? Я имею в виду, звонит Useffect
Каждый раз крошечный, малое изменение происходит с компонентом, это так эффективно?
Нет это не так. И большую часть времени мы не хотели бы, чтобы это произошло.
Useffect
Занимает второй дополнительный параметр, называемый массивом зависимостей. Мы передаем массив зависимости в Useffect
Чтобы сказать отреагировать не беспокоить Useffect
Каждый раз, когда изменение происходит с компонентом. Сказать реагирование, что просто нужно следить за переменными начисления зависимости и что ему нужно позвонить Useffect
только тогда, когда любая из этих переменных изменяется.
Так вот так Useffect
должен выглядеть так:
useEffect(()=>{ // code to run only on the first render and when depency1 or/and depency2 changes. }, // the dependency array [depency1, depency2]);
Давайте внести несколько изменений в наш последний пример и передайте массив зависимости в Useffect
Отказ
... // onOff will be a dependency to useEffect let [onOff, setOnOff] = React.useState(true); ... useEffect(()=>{ document.body.style.backgroundColor = getRandomColor(); // add onOff in the dependency array }, [onOff]) } ... // just a button to toggle the value of onOff
Если компонент имеет Useffect
Первое, что реагирует после первого визуализации, чтобы позвонить Useffect
– имеет ли он массив зависимости или нет. После этого реагировать, чтобы узнать, если Useffect
имеет массив зависимости или нет. И исходя из этого знания реагировать, ну, хорошо реагирует.
Если нет массива зависимости в useffect.
Реагировать, чтобы помнить, чтобы позвонить useffect.
Ведь будущее оказывает.
Если там это Массив зависимости передан useffect.
Реакция должна следить за всеми этими зависимостями. И после того, как какие-либо будущие изменения случаются с любым из них, реагировать придется позвонить Useffect
Отказ
Давайте посмотрим, что в коде.
В этом примере при реагировании звонков Useffect
После первого визуализации он знает, что есть ONOFF
зависимость передана ему. Итак, тогда помнит, что ему не придется позвонить useffect.
Разве ONOFF
изменения.
Следовательно, BG-цвет Тело
меняется только на первом визуализации и каждый раз ONOFF
изменения.
Обратите внимание, что изменение BG-цвет круга Div
не влияет на Тело
больше. Реагировать больше не звонить useffect.
После смены ОБРАЗБУЧКУБЛОКЛОР
Отказ
Так что теперь мы ограничили звонки на Useffect
От ” После каждого рендеринга/повторного визуализации ” на ” только после первого визуализации и всех повторных рендеров, вызванных изменениями зависимостей .”
Что, если мы хотим ограничить звонки даже меньше, чем это? Что если мы хотим запустить Useffect
только один раз, после первого визуализации?
Мы можем достичь этого, передавая пустой массив в качестве массива зависимости в Useffect
Отказ Делая это, Rect позвонит useffect.
После первого визуализации, а затем забыть все об этом. Это никогда не позвонит это снова.
Примечание : Вы должны быть осторожны при использовании []
как массив зависимости. Убедитесь, что Useffect
Не содержит никаких переменных ( состояние
или реквизит
) или функции изнутри его компонента. Рефакторист и полоса Useffect
Из всех переменных и функций изнутри его компонента перед использованием []
в качестве массива зависимости, или вы должны перечислить их как зависимости.
Последнее упомяновение на эту тему мы можем вернуть функцию в конце Useffect
Отказ Эта функция проходит после каждого повторного визуализации (справа прямо перед новым эффектом), чтобы убрать после эффекта от последнего визуализации. Он также работает прямо до того, как компонент удаляется из DOM.
Если мы немного изменимся в коде, образуем более ранний пример:
useEffect(()=>{ // add a delay to see the effect of the clean-up function setTimeout(()=>{ document.body.style.backgroundColor = getRandomColor() } , 500); // the clean up function return ()=>{ // it cleans up the bg-color of the body // just right before the new effect tasks a place // and changes it again document.body.style.backgroundColor = "white"; } }, [onOff])
Здесь, когда мы переключаем ONOFF
Функция очистки проходит для очистки BG-Color of Тело
до того, как новый эффект пройдет и снова изменяет его.
Вот и все. Спасибо за чтение.
Оригинал: “https://dev.to/hajarnasr/react-hooks-useeffect-1816”