首頁 >web前端 >js教程 >在外部點擊或捲動時關閉模式或下拉式選單。

在外部點擊或捲動時關閉模式或下拉式選單。

Patricia Arquette
Patricia Arquette原創
2024-12-28 08:45:10731瀏覽

Closing modals or dropdown on Outside click or scroll.

是否曾經建立過模態框或下拉式選單,並努力弄清楚當使用者在其外部點擊時如何將其關閉?是的..

這裡有一個很酷的 React hook 可以解決這個問題

import { useEffect, useRef } from "react";

const useOutsideClickOrScroll = <T extends HTMLElement>(
  callback: () => void
) => {
  const ref = useRef<T>(null);

  useEffect(() => {
    const handleClickOutside = (event: MouseEvent) => {
      if (ref.current && !ref.current.contains(event.target as Node)) {
        callback();
      }
    };

    const handleScroll = () => {
      callback();
    };

    document.addEventListener("mousedown", handleClickOutside);
    window.addEventListener("scroll", handleScroll, true);

    return () => {
      document.removeEventListener("mousedown", handleClickOutside);
      window.removeEventListener("scroll", handleScroll, true);
    };
  }, [callback]);

  return ref;
};

export default useOutsideClickOrScroll;

此鉤子使用 useRef 來定位 DOM 元素,並在外部點擊或捲動事件上觸發回調,確保使用 useEffect 進行正確的清理。它會傳回 ref,以便輕鬆附加到任何 DOM 元素。

這是一個範例用法

import React, { useState } from "react";
import useOutsideClickOrScroll from "./useOutsideClickOrScroll";

const Dropdown = () => {
  const [isOpen, setIsOpen] = useState(false);

  const handleClose = () => {
    setIsOpen(false);
  };

  const ref = useOutsideClickOrScroll<HTMLDivElement>(handleClose);

  return (
    <div>
      <button onClick={() => setIsOpen(!isOpen)}>Toggle Dropdown</button>
      {isOpen && (
        <div ref={ref}>
          <p>Dropdown Content</p>
        </div>
      )}
    </div>
  );
};

export default Dropdown;

以上是在外部點擊或捲動時關閉模式或下拉式選單。的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn