@spasiboivanu
frontend engineer at Sber.Tech

Нормально ли логировать что-либо в лямбде передаваемой в setState?

Нужно залогировать данные при обработке клика, нормально ли делать так:
const [isOpen, setIsOpen] = useState(false);

const onOpen = useCallback(() => {
  setIsOpen(open => {
    // тут какой-нибудь синхронный вызов, для отправки/сохранения данных
    return !open;
  }); 
}, []);


Понимаю, можно использовать useEffect с зависимостью от isOpen, но мне нужно отправлять данные только после клика, useEffect отработает всегда

Сейчас не уверен, что это правда хорошая практика, выполнять какой-то вспомогательный код в лямбде setState.
Временно сделал в-лоб:
useCallback(() => {
  if (isOpen) {
    // logger.send(false); и еще пару строк
    setIsOpen(false);
  } else {
    // logger.send(true); // и еще пару строк
     setIsOpen(true);
  }

  ну или:
  logger.send(isOpen);
  setIsOpen(!isOpen); // выглядит не надежно
}, [isOpen]);
  • Вопрос задан
  • 37 просмотров
Пригласить эксперта
Ответы на вопрос 1
Alexandroppolus
@Alexandroppolus
кодир
С точки зрения useCallback, первый вариант (который с лямбдой) безусловно лучше - мемоизованная функция не меняется при смене isOpen.
Но разработчики Реакта увещевают нас не делать побочных эффектов в лямбде для setState, т.е. оставить функцию чистой. Подробности тут: https://beta.reactjs.org/reference/react/useState . Здесь же говорится, то в строгом режиме будет наркомания с двойным вызовом лямбды.

попробуй так:
const onOpen = useCallback(() => {
  let value = false;
  setIsOpen(open => {
    value = open;  // как я понял, отправлять надо старое значение
    return !open;
  });
  Promise.resolve().then(() => logger.send(value));
}, []);
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы