[小程序]点击组件之外关闭组件

[小程序]点击组件之外关闭组件

[思路] 收集组件内所有元素的uid数组,判断点击事件的id是否在该uid数组内

直接上代码 (这是一个工具Hooks)

import { useEffect, useState } from 'react';

const useOnClickOutside = (
  containerId: string, // 组件所在整个页面的 id
  ref: any, // 要控制组件的ref
  handler: (e?: Event) => void, 点击元素之外的事件
) => {
  const [domIds, setDomIds] = useState<string[]>([]); // uid数组

// 收集组件内部的所有uid
  const collectInnerDomIds = (currentNode: any) => {
    let currentIds = domIds;
    currentIds.push(currentNode.uid);
    const list = new Set([...currentIds]); 
    setDomIds([...list]);
    if (currentNode.childNodes.length > 0) {
      currentNode.childNodes.map((item: any) => {
        collectInnerDomIds(item);
      });
    }
  };

  useEffect(() => {
    const container = document.getElementById(containerId);
    const listener = (e: Event) => {
      if (ref.current) {
        collectInnerDomIds(ref.current);
        if (domIds.includes(e?.mpEvent.target.id)) {
          console.log('inner');
        } else {
          console.log('out');
          handler(e);
        }
        return;
      }
    };
    container?.addEventListener('touchstart', listener, false);
    return () => {
      container?.removeEventListener('touchstart', listener);
    };
  }, [ref, handler]);
};

export default useOnClickOutside;

下面是组件中的使用

  useOnClickOutside('details', historyNamesRef, (e: Event) => {
    // 点击组件之外的事件
  });

版权声明:本文为qq_40088255原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。