טיפ ריאקט: איך לתפוס לחיצה מחוץ לקומפוננטה
חבר שואל - יש לי קומפוננטה שפותחת תפריט קופץ. איך אני מעלים את התפריט כשמשתמש לוחץ על המסך מחוץ לקומפוננטה? יש משהו כמו onClick אבל על כל שאר הדברים?
תשובה - בשביל לענות על זה צריך להיזכר באיך עובדים אירועים ב JavaScript. כל פעם שיש איזשהו אירוע על המסך הדפדפן אוטומטית נותן הזדמנות לאלמנטים לטפל באירוע. ברירת המחדל היא שאלמנט יכול לטפל באירוע שקורה אצלו, ואם הוא לא מטפל אז האירוע הזה "מבעבע" הלאה לאלמנט שמכיל אותו ואז לאלמנט שמכיל אותו וכך הלאה עד לאלמנט הכללי ביותר על המסך שזה window.
לכן בשביל לתפוס לחיצה מחוץ לאלמנט כל מה שאנחנו צריכים לעשות זה להקשיב לאירוע click על אוביקט window ושם נתפוס את כל הלחיצות. מאחר וגם אירועים בתוך האלמנט מבעבעים למעלה ל window, נצטרך דרך לזהות שאירוע מסוים התקיים מחוץ לאלמנט שמעניין אותנו. דרך קלה לפתור את זה היא להשתמש בפונקציה stopPropagation
של אוביקט אירוע כשאנחנו מטפלים בלחיצות שאנחנו לא רוצים שיגיעו הלאה ל window.
סך הכל הקוד נראה כך:
import React, { useEffect, useState } from 'react';
const initialText = "Click outside the component to change this text"
export function App(props) {
const [text, setText] = useState(initialText);
useEffect(() => {
const changeText = () => setText('Yay!');
window.addEventListener('click', changeText);
return () => {
window.removeEventListener(changeText);
}
}, []);
return (
<div
className='App'
style={{background: 'red'}}
onClick={(e) => e.stopPropagation()}
>
<h2>{text}</h2>
</div>
);
}
מוזמנים לשחק עם הקוד לייב בקודפליי בקישור: https://playcode.io/1848762