/
pdklzn
/
react-pizza
Обзор
Документация
Войти
/
pdklzn
/
react-pizza
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/components/Sort.jsx
69 строк
2 KB
Podkolzin Danila
first_commit
19 июн 2024, 14:29
19 июн 2024, 14:29
0ffaf2d
Код
Авторство
О чём код?
import React, { useEffect, useRef, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { setSort } from '../redux/slices/filterSlice'; export const filterList = [ { name: 'популярности', sort: 'rating' }, { name: 'цене', sort: 'price' }, { name: 'алфавиту', sort: 'title' }, ]; export const Sort = () => { const dispatch = useDispatch(); const sort = useSelector((state) => state.filterSlice.sort); const sortRef = useRef(); const [isVisible, setIsVisible] = useState(false); const onClickListItem = (obj) => { dispatch(setSort(obj)); // Передаем объект с полями name и sort setIsVisible(false); }; useEffect(() => { const handleClickOutside = (event) => { if (sortRef.current && !sortRef.current.contains(event.target)) { setIsVisible(false); } }; document.body.addEventListener('click', handleClickOutside); return () => { document.body.removeEventListener('click', handleClickOutside); }; }, []); return ( <div ref={sortRef} className="sort"> <div className="sort__label"> <svg width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M10 5C10 5.16927 9.93815 5.31576 9.81445 5.43945C9.69075 5.56315 9.54427 5.625 9.375 5.625H0.625C0.455729 5.625 0.309245 5.56315 0.185547 5.43945C0.061849 5.31576 0 5.16927 0 5C0 4.83073 0.061849 4.68424 0.185547 4.56055L4.56055 0.185547C4.68424 0.061849 4.83073 0 5 0C5.16927 0 5.31576 0.061849 5.43945 0.185547L9.81445 4.56055C9.93815 4.68424 10 4.83073 10 5Z" fill="#2C2C2C" /> </svg> <b>Сортировка по:</b> <span onClick={() => setIsVisible(!isVisible)}>{sort.name}</span> </div> {isVisible && ( <div className="sort__popup"> <ul> {filterList.map((obj, index) => ( <li key={index} className={sort.sort === obj.sort ? 'active' : ''} onClick={() => onClickListItem(obj)}> {obj.name} </li> ))} </ul> </div> )} </div> ); };