Как в реакт-компоненте получить класс элемента из evt.target при клике на document
import React, { useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { changeSortType } from '../../store/action';
import { AppDispatch, State } from '../../types/state';
import { SORT_TYPES } from '../../const';
function SortOffers(): JSX.Element {
const [activeClass, setActiveClass] = useState<string>('');
const currentSortType = useSelector<State>((store) => store.sortType);
const dispatch = useDispatch<AppDispatch>();
const toggleActiveClass = () => {
if (activeClass) {
setActiveClass('');
} else {
setActiveClass('places__options--opened');
}
};
document.addEventListener('click', (evt) => {
console.log(evt.currentTarget); // Как здесь получить className
});
return (
<form className="places__sorting" action="#" method="get">
<span className="places__sorting-caption">Sort by</span>
<span onClick={toggleActiveClass} className="places__sorting-type" tabIndex={0}>
{`${currentSortType}`}
<svg className="places__sorting-arrow" width="7" height="4">
<use xlinkHref="#icon-arrow-select"></use>
</svg>
</span>
<ul className={`places__options places__options--custom ${activeClass}`}>
{SORT_TYPES.map((sortType) => (
<li
onClick={(evt) => {
toggleActiveClass();
dispatch(changeSortType(evt.currentTarget.textContent));
}}
className={`places__option ${currentSortType === sortType ? 'places__option--active' : ''}`}
key={sortType}
tabIndex={0}
>
{sortType}
</li>
))}
</ul>
</form>
);
}
export default SortOffers;
Есть вот такой компонент. В нём есть выпадающий список с сортировкой - ul className={`places__options places__options--custom ${activeClass}`}> Если этот список открыт, то при клике МИМО этого списка, нужно его закрыть, убрав активный класс. Я хочу ловить клик на всём document-е и с помощью evt.target.className узнавать был клик по этому списку или МИМО него. Проблема в том что evt.target в данном случае не содержит в себе свойство className. Также не помогло использование evt.currentTarget.
Ответы (1 шт):
Автор решения: TupoScrip
→ Ссылка
Пока сделал так:
document.addEventListener('click', (evt) => {
const evtTarget = evt.target as HTMLElement;
if (evtTarget.className !== 'places__sorting-type' &&
evtTarget.className !== 'places__option' &&
activeClass === 'places__options--opened') {
toggleActiveClass();
}
});
Явно переопределять тип как HTMLElement вроде как плохая практика, но код работает и это главное.