@tostershmoster

Почему в консоли выводятся противоположные значения?

import { FC, useRef, useState } from 'react';
import './TrelloBoardColor.scss';

type Color = {
  name: string;
  value: string;
};

type Props = {
  color: Color;
};

const TrelloBoardColor: FC<Props> = ({ color }) => {
  const [isColorClicked, setIsColorClicked] = useState(false);
  const trelloBoardColorRef = useRef<HTMLDivElement>(null);

  const handleColorClick = () => {
    // при первом клике здесь становится значение в true
    // в инструментах разработчика я вижу класс 'trello-board-color_clicked' у элемента
    setIsColorClicked(!isColorClicked);

    // а тут выводится элемент только с классом 'trello-board-color'
    console.log(trelloBoardColorRef.current);

    // и тут значение false хотя класс 'trello-board-color_clicked' добавляется когда isColorClicked == true 
    console.log(`handleColorClick(isColorClicked): ${isColorClicked}`);
  };

  return (
    <div
      ref={trelloBoardColorRef}
      className={`trello-board-color ${isColorClicked ? 'trello-board-color_clicked' : ''}`}
      style={{ backgroundColor: `${color.value}` }}
      onClick={handleColorClick}></div>
  );
};

export default TrelloBoardColor;


и при последующих кликах значения в консоли выводятся наоборот. почему?

у меня несколько таких квадратов с цветами. нужно чтобы по клику можно было выбрать только один (и он стал отмечен галочкой) и другие при этом на клик не реагировали. я так понимаю переменная из стейта (isColorClicked) тут не подходит. как мне тогда сделать эти "флаги", рефы использовать?
  • Вопрос задан
  • 59 просмотров
Решения вопроса 1
Alexandroppolus
@Alexandroppolus
кодир
isColorClicked будет новый (точнее, это будет новая переменная) на новом рендере, который произойдет после завершения handleColorClick. Стейт поменялся, но в переменной handleColorClick старое значение, это просто переменная в замыкании.

класс в trelloBoardColorRef.current старый, потому что ещё не обновился, он станет новый после рендера.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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