Skip to content

Commit d91ece5

Browse files
committed
refactor: 미션7 useOutsideClick 분리하기
1 parent 4d84617 commit d91ece5

2 files changed

Lines changed: 26 additions & 14 deletions

File tree

src/components/KebabMenu.jsx

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { useEffect, useRef, useState } from 'react';
1+
import { useRef, useState } from 'react';
22
import kebabIcon from '@assets/icon/ic_kebab.png';
3+
import useOutsideClick from '../hooks/useOutsideClick';
34
import styles from '../styles/KebabMenu.module.css';
45

56
function makeHtmlAttr(selector) {
@@ -24,28 +25,22 @@ function KebabMenu({ dropdownList, onSelect = () => {} }) {
2425
setIsOpen(false);
2526
}
2627

27-
useEffect(() => {
28-
function closeDropDown(e) {
29-
if (!kebabRef.current.contains(e.target)) {
30-
setIsOpen(false);
31-
}
32-
}
33-
34-
window.addEventListener('click', closeDropDown);
28+
function onCloseDropdown() {
29+
setIsOpen(false);
30+
}
3531

36-
return () => window.removeEventListener('click', closeDropDown);
37-
}, []);
32+
useOutsideClick(kebabRef, onCloseDropdown);
3833

3934
return (
40-
<div className={styles.kebab}>
41-
<button ref={kebabRef} onClick={handleToggleDropDown}>
35+
<div className={styles.kebab} ref={kebabRef}>
36+
<button onClick={handleToggleDropDown}>
4237
<img src={kebabIcon} alt="케밥 아이콘" />
4338
</button>
4439
{isOpen && (
4540
<ul role="listbox">
4641
{dropdownList?.map((selector) => (
4742
<li
48-
key={`${selector}`}
43+
key={selector}
4944
{...makeHtmlAttr(selector)}
5045
onClick={() => handleClick(selector)}
5146
>

src/hooks/useOutsideClick.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { useEffect } from 'react';
2+
3+
function useOutsideClick(ref, onCloseDropdown) {
4+
useEffect(() => {
5+
function closeDropdownHandler(e) {
6+
if (ref.current && !ref.current.contains(e.target)) {
7+
onCloseDropdown();
8+
}
9+
}
10+
11+
window.addEventListener('click', closeDropdownHandler);
12+
13+
return () => window.removeEventListener('click', closeDropdownHandler);
14+
}, [ref, onCloseDropdown]);
15+
}
16+
17+
export default useOutsideClick;

0 commit comments

Comments
 (0)