Если вы возвращаете объект {}
или массив []
из контекста, то значение контекста ИЗМЕНИЛОСЬ.
Переменная someContextValue
определяется внутри компонента.
Компонент - это функция, и когда функция запускается, значения, определенные внутри нее, определяются. Если, например, ваш контекст возвращает объект, содержащий значения состояния, то этот объект является экземпляром, отличным от экземпляра из предыдущего рендеринга, и ваш useEffect
запускается из-за этого.
useEffect
будет сравнивать ссылочные типы по их экземпляру, а не по значениям внутри них.
Когда вы вызываете useSomeContext()
, вы создаете новый объект, и это происходит каждый раз при рендеринге компонента.
Это не то же самое, что значение состояния из useState
, где значение состояния не переопределяется. Хук useState
поддерживает один и тот же экземпляр значения, поэтому он не создается заново каждый раз, и useEffect
видит, что значение состояния является одним и тем же экземпляром.
Вот почему при использовании контекста вы должны деструктурировать объект контекста и ссылаться на значения внутри объекта, которые являются либо значениями состояния, переданными из ловушки useState
внутри контекст или значение, определенное внутри контекста, которое не переопределяется при повторном рендеринге вашего потребляющего компонента (поскольку в этом случае контекст не повторно рендерится):
const { someStateValue } = useSomeContext()
useEffect(() => {
someStateValue()
}, [someStateValue]);
person
JMadelaine
schedule
11.05.2020
useSomeContext()
, вы создаете новый объект, и это происходит каждый раз при рендеринге компонента. Это не то же самое, что значение состояния, где значение состояния не переопределяется, хукuseState
поддерживает один и тот же экземпляр значения, поэтому он не воссоздается каждый раз. - person JMadelaine   schedule 11.05.2020