Доступ к контексту из useEffect

У меня есть контекст, который используется для отображения полного счетчика страниц, пока мое приложение выполняет длительные задачи.

Когда я пытаюсь получить к нему доступ внутри useEffect, я получаю сообщение react-hooks/exhaustive-deps ESLint. Например, следующий код, хотя и работает как положено, утверждает, что busyIndicator — это отсутствующая зависимость:

const busyIndicator = useContext(GlobalBusyIndicatorContext);

useEffect(() => {
    busyIndicator.show('Please wait...');
}, []);

В статье Этот предлагается обернуть функцию useCallback, которая может выглядеть следующим образом:

const busyIndicator = useContext(GlobalBusyIndicatorContext);
const showBusyIndicator = useCallback(() => busyIndicator.show('Please wait...'), []);

useEffect(() => {
    showBusyIndicator();
}, [showBusyIndicator]);

Хотя это работает, проблема переместилась в строку useCallback, которая теперь жалуется на отсутствующую зависимость.

Можно ли игнорировать сообщение ESLint в этом сценарии или я что-то упустил?

🤔 А знаете ли вы, что...
React обладает активным сообществом разработчиков и множеством сторонних библиотек и компонентов.


18
20 884
2

Ответы:

Решено

Если ваш busyIndicator не изменился в течение жизни компонента, вы можете просто добавить его как зависимость к useEffect:

const busyIndicator = useContext(GlobalBusyIndicatorContext);

useEffect(() => {
    busyIndicator.show('Please wait...');
}, [busyIndicator]);

Если busyIndicator можно изменить и вы не хотите видеть ошибку, вы можете использовать useRef хук:

const busyIndicator = useRef(useContext(GlobalBusyIndicatorContext));

useEffect(() => {
    busyIndicator.current.show('Please wait...');
}, []);

The useRef() Hook isn’t just for DOM refs. The “ref” object is a generic container whose current property is mutable and can hold any value, similar to an instance property on a class. read more


Не нужно обертывать ваш useContext в хук useRef. вы можете обновить свои контекстные данные, просто позвоните в useEffect Brackets так.

const comingData = useContext(taskData);

useEffect(() => {
console.info("Hi useEffect");
}},[comingData]); //context data is updating here before render the component