چطور در React کلیک از کامپوننت را تشخیص دهیم؟
mohsen•1 ماه قبل
ارسال شده در
reactتشخیص اینکه آیا یک کلیک خارج از یک کامپوننت React رخ داده است، یکی از چالشهای رایج در کار با React است. برای این کار میتوان از ترکیب ویژگیهای React و DOM استفاده کرد. در اینجا چند روش برای انجام این کار توضیح داده میشود.
روش استفاده از هوک (Hooks)
یک روش ساده و موثر برای تشخیص کلیک خارج از کامپوننت استفاده از هوک سفارشی مانند useOutsideAlerter
است. این هوک با ثبت یک لیسنر کلیک روی داکیومنت، وقتی کاربر بر روی جایی خارج از کامپوننت کلیک کند، این موضوع را شناسایی می کند. این روش به صورت زیر پیادهسازی میشود:
import React, { useRef, useEffect } from "react";
function useOutsideAlerter(ref) {
useEffect(() => {
function handleClickOutside(event) {
if (ref.current && !ref.current.contains(event.target)) {
alert("شما بر روی من کلیک کردید!");
}
}
document.addEventListener("mousedown", handleClickOutside);
return () => {
document.removeEventListener("mousedown", handleClickOutside);
};
}, [ref]);
}
export default function OutsideAlerter(props) {
const wrapperRef = useRef(null);
useOutsideAlerter(wrapperRef);
return <div ref={wrapperRef}>{props.children}</div>;
}
این کد، یک کامپوننت به نام OutsideAlerter
تعریف میکند که در آن میتوان به راحتی محتوای خود را درون آن قرار داد و کلیکهایی که در خارج از آن اتفاق میافتند را شناسایی کرد.
پیادهسازی با کلاس (نسخه 16.3 به بعد)
اگر شما از کلاسها استفاده میکنید، میتوانید این رویکرد را به صورت زیر انجام دهید:
import React, { Component } from "react";
export default class OutsideAlerter extends Component {
constructor(props) {
super(props);
this.wrapperRef = React.createRef();
this.handleClickOutside = this.handleClickOutside.bind(this);
}
componentDidMount() {
document.addEventListener("mousedown", this.handleClickOutside);
}
componentWillUnmount() {
document.removeEventListener("mousedown", this.handleClickOutside);
}
handleClickOutside = (event) => {
if (this.wrapperRef.current && !this.wrapperRef.current.contains(event.target)) {
alert("شما بر روی من کلیک کردید!");
}
};
render() {
return <div ref={this.wrapperRef}>{this.props.children}</div>;
}
}
رای
0
ارسال نظر
مرتب سازی:
اولین نفری باشید که نظر می دهید!