useClickAway

Β 
useClickAway Hook은 νŠΉμ • UI의 μ™ΈλΆ€λ₯Ό ν΄λ¦­ν–ˆμ„ λ•Œ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•  수 있게 ν•΄μ£ΌλŠ” Hookμž…λ‹ˆλ‹€. 예λ₯Όλ“€μ–΄ λͺ¨λ‹¬μ°½μ΄ ν™œμ„±ν™”κ°€ λ˜μ–΄μžˆλŠ” μƒνƒœμ—μ„œ λ‹«κΈ°λ²„νŠΌμ΄ μ•„λ‹Œ μ™ΈλΆ€λ₯Ό ν΄λ¦­ν•˜μ—¬ λͺ¨λ‹¬μ°½μ„ 닫고싢은 κ²½μš°κ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 경우 useClickAway λ₯Ό μ‚¬μš©ν•˜λ©΄ 이λ₯Ό 보닀 μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆλŠ”λ° 예제λ₯Ό 톡해 useClickAway 의 기본ꡬ쑰와 μ‚¬μš©λ²•μ— λŒ€ν•΄ μ•Œμ•„λ³΄κ³  λͺ¨λ‹¬μ°½μ„ λ‹«λŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.
Β 
useClickAway(ref, fn, ['click']);
Β 
useClickAway의 κΈ°λ³Έν˜•νƒœλŠ” μœ„μ™€ κ°™μœΌλ©° μ•„λž˜μ˜ 예제λ₯Ό 톡해 μžμ„Έν•œ μš©λ²•μ— λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.
Β 
import { useClickAway } from "react-use"; import { useRef } from "react"; const App = () => { const foo = () => { console.log("ref의 μ™ΈλΆ€κ°€ ν΄λ¦­λ˜μ—ˆμŠ΅λ‹ˆλ‹€."); }; const ref = useRef(null); useClickAway(ref, foo, ['click']); return ( <div ref={ref} style={{ width: 100, height: 100, background: "pink", }} /> ); }; export default App;
App.jsx
Β 
notion imagenotion image
Β 
μ˜ˆμ œλŠ” μœ„μ˜ 이미지와 같이 λΆ„ν™λ°•μŠ€ λ°”κΉ₯뢀뢄을 ν΄λ¦­ν•˜λ©΄ μ½˜μ†”μ°½μ— λ©”μ‹œμ§€κ°€ 좜λ ₯ 되고 λΆ„ν™λ°•μŠ€λ₯Ό ν΄λ¦­ν•˜λ©΄ 아무일도 μΌμ–΄λ‚˜μ§€ μ•ŠλŠ” κ°„λ‹¨ν•œ μ˜ˆμ œμž…λ‹ˆλ‹€. 이λ₯Όν†΅ν•΄ μ•Œ 수 μžˆλŠ” 것은 useClickAway의 첫 번째 μΈμžμ—λŠ” μ™ΈλΆ€μ˜μ—­ μ΄μ™Έμ˜ μš”μ†Œλ₯Ό 가리킀며 두 번째 μΈμžμ—λŠ” ref의 μ™ΈλΆ€μš”μ†Œκ°€ ν΄λ¦­λ˜μ—ˆμ„ λ•Œ μ‹€ν–‰ 될 ν•¨μˆ˜λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€. 그리고 μ„Έ 번째 μΈμžμ—λŠ” μ›ν•˜λŠ” 이벀트 μ’…λ₯˜λ₯Ό λ„£κ²Œλ˜λŠ”λ° μ„Έ 번째 인자λ₯Ό μƒλž΅ν•  경우 기본적으둜 β€˜click’ μ΄λ²€νŠΈμ‹œ νŠΈλ¦¬κ±°λ˜λ„λ‘ 섀정이 λ©λ‹ˆλ‹€.
Β 
useClickAway(ref, () => { console.log("ref의 μ™ΈλΆ€μš”μ†Œκ°€ ν΄λ¦­λ˜μ—ˆμŠ΅λ‹ˆλ‹€."); });
Β 
λ˜ν•œ μœ„μ˜ 예제처럼 두 번째 μΈμžμ—μ„œ λ°”λ‘œ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜μ—¬ μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.μ§€κΈˆκΉŒμ§€useClickAway의 κΈ°λ³Έν˜•νƒœμ— λŒ€ν•΄ μ•Œμ•„λ³΄μ•˜μœΌλ‹ˆ μ΄μ–΄μ§€λŠ” μ˜ˆμ œμ—μ„œ λͺ¨λ‹¬μ°½μ„ λ‹«λŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.
Β 
import { useState } from "react"; const App = () => { const [onModal, setOnModal] = useState("none"); const Modal = () => { onModal ? setOnModal(false) : setOnModal("none"); }; return ( <> <button style={{ margin: 20, }} onClick={Modal} > λͺ¨λ‹¬μ°½μ„ λ„μ›Œμ£Όμ„Έμš”! </button> <div style={{ display: onModal, position: "absolute", top: 10, background: "pink", width: 200, }} > <p style={{ textAlign: "center", }} > λͺ¨λ‹¬μ°½μ„ λ‹«κ² μŠ΅λ‹ˆκΉŒ? </p> <button onClick={Modal} style={{ width: 200 }}> 예 </button> </div> </> ); }; export default App;
App.jsx
Β 
notion imagenotion image
notion imagenotion image
Β 
μ˜ˆμ œμ™€ 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ μœ„μ™€ 같이 λͺ¨λ‹¬μ°½μ„ λ„μšΈ 수 μžˆλŠ” λ²„νŠΌμ΄ μƒμ„±λ©λ‹ˆλ‹€. λ²„νŠΌμ„ λˆ„λ₯΄κ²Œλ˜λ©΄ λͺ¨λ‹¬μ°½μ΄ ν™œμ„±ν™”κ°€ 되며 β€œμ˜ˆβ€λ₯Ό λˆ„λ₯΄λ©΄ λͺ¨λ‹¬μ°½μ΄ λ‹«νžˆκ²Œ λ©λ‹ˆλ‹€. ν˜„μž¬μ˜ μƒνƒœμ—μ„œλŠ” λͺ¨λ‹¬μ°½μ˜ μ™ΈλΆ€λ₯Ό ν΄λ¦­ν•˜μ—¬λ„ λͺ¨λ‹¬μ°½μ€ κ·ΈλŒ€λ‘œ λ‚¨μ•„μžˆλŠ” 것을 μ•Œ 수 μžˆλŠ”λ° μ΄λŠ” μ‚¬μš©μž νŽΈμ˜μ„±μ„ κ³ λ €ν•΄λ³΄μ•˜μ„ λ•Œ 약간은 λΆˆνŽΈν•˜λ‹€κ³  생각이 λ“€μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λͺ¨λ‹¬μ°½μ˜ μ™ΈλΆ€λ₯Ό ν΄λ¦­ν•˜μ˜€μ„λ•Œμ—λ„ λͺ¨λ‹¬μ°½μ΄ λ‹«νž 수 있게 useClickAway λ₯Ό ν™œμš©ν•˜μ—¬ μ½”λ“œλ₯Ό κ°œμ„ ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
Β 
import { useClickAway } from "react-use"; import { useRef } from "react"; import { useState } from "react"; const App = () => { const ref = useRef(null); useClickAway(ref, () => { if (onModal === "none") { return; } setOnModal("none"); }); const [onModal, setOnModal] = useState("none"); const Modal = () => { onModal ? setOnModal(false) : setOnModal("none"); }; return ( <> <button style={{ margin: 20 }} onClick={Modal}> λͺ¨λ‹¬μ°½μ„ λ„μ›Œμ£Όμ„Έμš”! </button> <div ref={ref} style={{ display: onModal, position: "absolute", top: 10, background: "pink", width: 200, }} > <p style={{ textAlign: "center", }} > λͺ¨λ‹¬μ°½μ„ λ‹«κ² μŠ΅λ‹ˆκΉŒ? </p> <button onClick={Modal} style={{ width: 200 }}> 예 </button> </div> </> ); }; export default App;
App.jsx
Β 
μ•žμ„  예제λ₯Ό μœ„μ™€κ°™μ΄ λ³€κ²½ν•΄μ£Όλ©΄ λͺ¨λ‹¬μ°½μ˜ μ™ΈλΆ€λ₯Ό ν΄λ¦­ν•˜μ—¬λ„ λͺ¨λ‹¬μ°½μ΄ λ‹«νžˆλŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
Β 
이처럼 useClickAway λ₯Ό ν™œμš©ν•˜λ©΄ νŠΉμ • UI의 μ™ΈλΆ€μš”μ†Œκ°€ ν΄λ¦­λ˜μ—ˆμ„ λ•Œ 콜백 ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œν‚¬ 수 있으며 클릭 λΏλ§Œμ•„λ‹ˆλΌ λ‹€μ–‘ν•œ eventλ₯Ό μ μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.