💙 React

[REACT] DropDown

Eun_zii 2022. 10. 6. 13:40

🎣 1. Bootstrap.jsx 컴포넌트 생성

import Dropdown from './Dropdown'

const Bootstrap = () => {
  return (
    <div>
      <Dropdown />
    </div>
  )
}
export default Bootstrap

🎣 2. Dropdown.jsx 컴포넌트 생성

import { useEffect, useState, useRef } from 'react'
import styled from 'styled-components'

const Dropdown = () => {
  const [showList, setShowList] = useState(false)
  const btnEl = useRef(null)

  useEffect(() => {
    const onClick = (e) => {
      if (btnEl.current !== e.target) setShowList(false)
    }
    document.body.addEventListener('click', onClick)
    return () => {
      document.body.removeEventListener('click', onClick)
    }
  }, [])

  return (
    <Wrapper>
      <Button ref={btnEl} onClick={() => setShowList(!showList)}>
        Dropdown
      </Button>
      {showList && (
        <List>
          <Item>Item #1</Item>
          <Item>Item #2</Item>
          <Item>Item #3</Item>
          <Item>Item #4</Item>
        </List>
      )}
    </Wrapper>
  )
}

const Wrapper = styled.div`
  position: relative;
`
const Button = styled.button``
const List = styled.ul`
  list-style: none;
  margin: 0;
  padding: 0;
  background: #fff;
  border: 1px solid #ddd;
  border-radius: 4px;
  min-width: 200px;
  position: absolute;
`
const Item = styled.li`
  padding: 5px 15px;
  & + & {
    border-top: 1px solid #ddd;
  }
  :hover {
    background: #efefef;
  }
`

export default Dropdown

 

⭐️

  • Drop down 을 열고 drop down 을 제외한 부분을 클릭했을때 (body라던가..) drop down이 닫히고 ( 닫힌다는 것은 drop down 내에 show List가 false가 되는것 )
  • false가 되려면 전체 body에 Event Listener를 붙여서 body가 클릭될때마다 false를 만드는것. 하지만 Btn도 body라서 절대 true가 될수없다. 그래서 btn과 클릭한 target을 비교해서 btn을 누른상황이면 show List를 false로 만들지 않는것.
  • body에 remove Event Listener를 붙이지 않으면 console.log가 여러번 찍히게 되니 remove를 붙이는게 좋다.

⭐️

 

728x90