Чтобы добавить больше подробностей к ответам @MarkoCen (это верно), есть несколько вещей, которые нужно знать при работе с крючками:
useEffect
выполняется после каждый рендер.
При каждом рендеринге компонент повторно запускается с начала, после определения перехватчиков. Учитывая ваш код (я добавил комментарии для идентификации каждого цикла)
const [selected, setSelectedState] = useState(true); // 0
let className = "none"; // 1
useEffect(() => {
// 3
className = "appointment-item " + (selected ? "selected" : "");
console.log(className );
}, [selected] );
// 2
return (
<div className={`${className}`} onClick={()=>setSelectedState(!selected)}>{Math.random()}</div>
);
Вот циклы в следующем порядке:
Первый рендер:
Повторное отображение:
Как видно каждый рендеринг каждый раз устанавливает className
в «none», поэтому у вас никогда не будет того, что вы ожидаете.