Β
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
Β
Β
μμ λ μμ μ΄λ―Έμ§μ κ°μ΄ λΆνλ°μ€ λ°κΉ₯λΆλΆμ ν΄λ¦νλ©΄ μ½μμ°½μ λ©μμ§κ° μΆλ ₯ λκ³ λΆνλ°μ€λ₯Ό ν΄λ¦νλ©΄ μ무μΌλ μΌμ΄λμ§ μλ κ°λ¨ν μμ μ
λλ€. μ΄λ₯Όν΅ν΄ μ μ μλ κ²μ
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
Β
Β
μμ μ κ°μ΄ μ½λλ₯Ό μμ±νλ©΄ μμ κ°μ΄ λͺ¨λ¬μ°½μ λμΈ μ μλ λ²νΌμ΄ μμ±λ©λλ€. λ²νΌμ λλ₯΄κ²λλ©΄ λͺ¨λ¬μ°½μ΄ νμ±νκ° λλ©° βμβλ₯Ό λλ₯΄λ©΄ λͺ¨λ¬μ°½μ΄ λ«νκ² λ©λλ€. νμ¬μ μνμμλ λͺ¨λ¬μ°½μ μΈλΆλ₯Ό ν΄λ¦νμ¬λ λͺ¨λ¬μ°½μ κ·Έλλ‘ λ¨μμλ κ²μ μ μ μλλ° μ΄λ μ¬μ©μ νΈμμ±μ κ³ λ €ν΄λ³΄μμ λ μ½κ°μ λΆνΈνλ€κ³ μκ°μ΄ λ€μλ μμ΅λλ€. λ°λΌμ λͺ¨λ¬μ°½μ μΈλΆλ₯Ό ν΄λ¦νμμλμλ λͺ¨λ¬μ°½μ΄ λ«ν μ μκ²
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λ₯Ό μ μ©ν μλ μμ΅λλ€.