@timofeus91
Junior Frontend Developer

Как правильно работать с useEffect и window вместе?

У меня есть задача, связанная с адресной строкой и отслеживанием ее изменений. Мне это нужно для того, чтобы менять адресную строку или брать из нее данные для запросов. Я столкнулся с проблемой при работе с хуком UseEffect и глобальным событием ветра. Для меня это оказалась очень странная ситуация. Ниже приведены несколько вариантов.

1 вариант. Я делаю window.history.pushState. У меня есть поиск, но хук зависимостей для этих изменений не работает.

const [testState, setTestState] = useState(false);

    useEffect(() => {
        console.log('search changed.', window.location.search)

    }, [window.location.search])

    const testChangeLocation= () => {
        window.history.pushState(
            {},
            "add test searchURL ",
            `${window.location.href}/?testParams`
        );
      
    }


Вариант 2. Делаю то же, что и в варианте 1, но также меняю любое состояние использования в компоненте. С таким набором работает useEffect.

const [testState, setTestState] = useState(false);

    useEffect(() => {
        console.log('search changed.', window.location.search)

    }, [window.location.search])

    const testChangeLocation= () => {
        window.history.pushState(
            {},
            "add test searchURL ",
            `${window.location.href}/?testParams`
        );
        setTestState(!testState)
    }


3 вариант - делаю то же что и во втором варианте, но отменяю зависимость и тогда хук не срабатывает.

const [testState, setTestState] = useState(false);

    useEffect(() => {
        console.log('search changed.', window.location.search)

    }, [])

    const testChangeLocation= () => {
        window.history.pushState(
            {},
            "add test searchURL ",
            `${window.location.href}/?testParams`
        );
        setTestState(!testState)
    }


Оказывается, мой хук действительно отслеживает изменения в window .location.search. но только в том случае, если в функции изменилось что-то еще, даже если это не имело никакого отношения к моему useEffect. Я не понимаю, почему он работает именно так, и почему мой 1-й вариант не хочет работать и отслеживаться. Я надеюсь, что сообщество поможет мне разобраться в этой ситуации. Поэтому кто может - объясните , пожалуйста почему это именно так происходит и стоит ли вообще работать с window в этой ситуации?
  • Вопрос задан
  • 304 просмотра
Решения вопроса 1
Alexandroppolus
@Alexandroppolus
кодир
просто воспользуйся пакетом react-router-dom

https://reactrouter.com/en/v6.3.0/api#usesearchparams
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы