Компонент с setinterval не обновляется при изменении состояния контекста

#reactjs #react-hooks #react-context

Вопрос:

проблема

Когда я обновляю объект, хранящийся в моем ContextProvider, я вижу, что все данные обновляются соответствующим образом, за исключением обратного отсчета даты.

Подробные сведения

У меня есть компонент боковой панели, который отображает данные из списка. При нажатии на элемент списка я обновляю состояние объекта, выбранного в отдельном контексте реакции. Это прекрасно работает. Пример того, какой объект хранится, приведен ниже.

Объект Контекста

 {
   "title": "I am the title",
   "startDate" "2021-11-01T02:00:00.000Z"
}
 

Затем я использую этот объект для вывода компонента боковой панели с заголовком и отсчетом секунд.

Сайдпанель.tsx

 export function SidePanel() {
    const { active } = useSidePanel()

    const countdown = useCountdown(new Date(active.startDate))

    return (
        <div>
            <h1>{active.title}</h1>
            <p>{countdown} seconds to go</p>
        </div>
    )
}
 

useCountdown.tsx

 export function useCountdown(date: Date) {
    const [countdown, setCountdown] = useState<number>(0)

    const formatCountdown = () => {
        const diffInSeconds = dateFns.differenceInSeconds(date, new Date())

        if (diffInSeconds <= 1) return 0
        setCountdown(diffInSeconds)
    }

    useEffect(() => {
        const interval = setInterval(() => {
            formatCountdown()
        }, 1000)

        return () => clearInterval(interval)
    }, [])

    return countdown
}
 

Ответ №1:

Поэтому, добавив «дата» в массив useEffect внутри useCountdown.tsx, я смог решить эту проблему

 export function useCountdown(date: Date) {
    ...

    useEffect(() => {
        const interval = setInterval(() => {
            formatCountdown()
        }, 1000)

        return () => clearInterval(interval)
    }, [date])
   
    ...

}
 

Комментарии:

1. Да, вы должны слушать изменения состояния в квадратных скобках