Вам нужен фоновый DIV, чтобы разрешить щелчок и выход в любом месте на странице.
Это как трехслойная система.
- 1-й: содержание вашей страницы
- 2-й: фон идет сверху
- 3-й: ваш выпадающий список выходит на задний план
Пример (используется styled-components
для стиля, но вы можете использовать стиль по своему желанию):
Backdrop.js
Отображает div поверх содержимого вашей страницы.
const Backdrop = styled.div`
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.2);
z-index: 100;
`;
Используйте это так: условно с isDropdownOpen
Dropdown.js
Но не забудьте обозначить свой выпадающий список z-index
с чем-то большим, чем z-index
, которое вы использовали на фоне. В этом примере я использовал 100 для фона, так что вы можете использовать 200.
export const Dropdown() {
...
return(
isDropdownOpen ?
<Backdrop onClick={toggleDropdown}/>
// Here goes the rest of your return for your dropdown
);
}
Если вам нужен один выпадающий список, чтобы закрыть предыдущий при нажатии, вам нужно что-то в вашем state
, которое сообщит вам, какой из них открыт.
Что-то вроде:
const [indexDropdownOpened, setIndexDropdownOpened] = useState(false);
Вы можете установить его на false
(начальное значение), когда раскрывающийся список не открыт, и вы можете установить его с помощью index
(или key
), чтобы указать компоненту, какой из них является открытым.
В каждом раскрывающемся списке при рендеринге:
...
return(
<Container
key={index}
onClick={()=>setIndexDropdownOpened(index)}
/>
);
Тогда на заднем плане вы могли бы сделать:
<Backdrop onClick={()=>setIndexDropdownOpnened(false)}/> // So it closes the dropdown