Dropdown, Overflow Menu, Select 등 외부를 클릭할 때 모달을 없애줘야할 때가 있다.

바깥 버튼을 누르면 동시 2개의 이베트가 처리되어야하는데 여간 머리가 아프다..

해결책

1번

ref을 사용해서 이벤트를 심어주자

2번

onFocus, onBlur를 활용하자

div에 focus할 수 있게 tabIndex 설정을 해줘야 한다.

export function DropDown({ options, callback }) {
		const [selected, setSelected] = useState("");
    const [expanded, setExpanded] = useState(false);

    function expand() {
        setExpanded(true);
    }

    function close() {
        setExpanded(false);
    }

    function select(event) {
        const value = event.target.textContent;
        callback(value);
        close();
        setSelected(value);
    }

    return (
        <div tabIndex={0} onFocus={expand} onBlur={close} >
            <div>{selected}</div>
            {expanded && (
                <div>
                    {options.map((O) => (
                        <div onClick={select}>
                            {O}
                        </div>
                    ))}
                </div>
            )}
        </div>
    );
}

장점

단점

결론

참고