Могу ли я вызвать setState () из setTimeout ()? - PullRequest
0 голосов
/ 15 мая 2019

В моем компоненте есть следующий код:

  • Я начинаю эффект отскока, вызывая setState с setPosition(-0.08)
  • Затем я использую ref для сохранения setTimeout с вызовом setPosition(0) через 350 мс.
function changeImage(dir) {

  const isBouncing = useRef(false);
  const bounceTimeout = useRef(null);
  // ... some other code

  if (dir === 'LEFT' && selected === 0) {
      isBouncing.current = true;
      setPosition(-0.08);
      bounceTimeout.current = setTimeout(()=> { 
        isBouncing.current = false;
        setPosition(0);
      }, 350);
      return;
    }
}

Работает как задумано!

ВОПРОС

Есть ли причина, по которой мне не следует этого делать (звонить setState с setTimeout)?

1 Ответ

1 голос
/ 15 мая 2019

Вы можете позвонить setState с номера setTimeout. Это, например, один из способов достижения анимации.

Но в вашем случае вы должны переместить свой код в useEffect ловушку, иначе это может вызвать побочные эффекты.

И вам также нужно очистить тайм-аут при размонтировании

useEffect(() => {
  return () => {
    if (bounceTimeout.current !== null) {
      clearTimeout(bounceTimeout.current)
    }
  }
}, [])
...