#javascript #reactjs #redux #setinterval
#javascript #reactjs #redux #setinterval
Вопрос:
У меня простой js setInterval
, где мой обратный вызов просто проверяет некоторую Redux
переменную:
setInterval(() => {
console.log(props.myStateVariable);
}, 5000);
Проблема в том, что она просто печатает все, что было переменной во время создания этого setInterval
экземпляра. Как сделать ее динамической? Спасибо
Редактировать
А что, если это myStateVariable
строковая переменная длинного редактируемого текста, поэтому я бы предпочел не переустанавливать этот тайм-аут каждый раз, когда кто-то вводит письмо?
Комментарии:
1. Вы пытались передать ее в качестве параметра функции?
2. Вы пробовали использовать useSelector hook? Это то, что я использую для получения динамических значений из хранилища redux. react-redux.js.org/api/hooks
3. Спасибо @Viet…
4. На самом деле нет, ни один из комментариев не работает…
5. @true_gler Вы имеете в виду передать значение реквизита? Но вот в чем дело: я изначально не знаю этого значения и хочу выводить его каждые 5 секунд.
Ответ №1:
Попробуйте сохранить интервальную функцию в переменной, переопределяйте интервальную функцию каждый раз, когда изменяется props.myStateVariable:
const interval = useRef(null);
useEffect(()=> {
interval.current = setInterval(() => {
console.log(props.myStateVariable);
}, 5000);
return ()=> clearInterval(interval.current);
}, [props.myStateVariable]);
Редактировать:
Если вы не хотите переопределять интервал каждый раз при изменении свойства, вы можете использовать useRef
перехват для сохранения значения свойства. Таким образом, вы можете получить доступ к его значению:
const propRef = useRef(null);
propRef.current = props.myStateVariable;
useEffect(()=> {
const interval = setInterval(() => {
console.log(propRef.current);
}, 5000);
return ()=> clearInterval(interval);
}, []);
Комментарии:
1. Спасибо, чувак, я слишком долго с этим боролся 🙂
2. Приветствую вас. Также вам не нужно создавать ссылку, вы можете создать переменную внутри useEffect, и она тоже должна работать. useEffect(()=> { const interval = setInterval(() => {console.log(props.myStateVariable); }, 5000); return ()=> clearInterval(интервал); }, [props.myStateVariable]). Ссылка полезна, если вам нужно использовать ее в других местах
3. Конечно, я это знаю, еще раз спасибо. Теперь я чувствую себя глупо 🙂
4. Я отредактировал свой вопрос, может быть, у вас есть ответ?
5. Как пробовал с государством, не сработало. Пробовал с неизменяемым js, не сработало. Попытка с redux не сработала. Серьезно, у react functional components есть некоторые проблемы с рендерингом.. Ваше решение сработало, брат.. Спасибо