首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MouseEvent目标类型

MouseEvent目标类型
EN

Stack Overflow用户
提问于 2020-09-03 12:12:12
回答 2查看 303关注 0票数 1

我有一个定制钩子

代码语言:javascript
复制
const hasIgnoredClass = (element: Element, ignoredClass: string) =>
  (element.correspondingElement ? 
    element.correspondingElement : element
  ).classList.contains(ignoredClass);

const isInIgnoredElement = (element: Element, ignoredClass: string) => {
  do {
    if (hasIgnoredClass(element, ignoredClass)) {
      return true;
    }
  } while ((element = element.parentElement));
  return false;
};
function useOnClickOutside(
  refs: Array<any>, 
  handler: (e:MouseEvent | TouchEvent) => void,
  ignoreClass = 'ignore-class'
){
  React.useEffect(()=>{
    const listener = (e: MouseEvent | TouchEvent) => {
      const isValidElement = refs.some(ref => {
        if(!ref.current || ref.current.contains(e.target) || isInIgnoredElement(e.target, ignoreClass)){ return true; }
      });
      !isValidElement && handler(e);
    }
    document.addEventListener('mousedown', listener);
    document.addEventListener('touchstart', listener);

    return () => {
      document.removeEventListener('mousedown', listener);
      document.removeEventListener('touchstart', listener);
    };
  },[refs, handler]);

}

我有点警觉

属性'correspondingElement‘在类型'Element'. is (2339)中不存在。类型'null‘不能分配给’Element‘. to (2322)

我的钩子的合适类型是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-03 14:31:09

我想我找到了答案。

代码语言:javascript
复制
const hasIgnoredClass = (element: SVGAElement, ignoredClass: string) =>
  (element.correspondingElement ? element.correspondingElement : element).classList.contains(ignoredClass);

const isInIgnoredElement = (element: Node, ignoredClass: string) => {
  if (element === null) return;
  do {
    if (hasIgnoredClass(element as SVGAElement, ignoredClass)) {
      return true;
    }
  } while ((element = element.parentElement as Element));
  return false;
};
export default function useOnClickOutside(
  refs: Array<React.RefObject<HTMLElement>>,
  handler: (e: MouseEvent | TouchEvent) => void,
  ignoreClass = 'ignore-onClickOutside',
) {
  React.useEffect(() => {
    const listener = (e: MouseEvent | TouchEvent) => {
      const elem = e.target as Node;
      const isValidElement = refs.some(ref => {
        if (!ref.current || ref.current.contains(elem) || isInIgnoredElement(elem, ignoreClass)) {
          return true;
        }
      });
      !isValidElement && handler(e);
    };
    document.addEventListener('mousedown', listener);
    document.addEventListener('touchstart', listener);

    return () => {
      document.removeEventListener('mousedown', listener);
      document.removeEventListener('touchstart', listener);
    };
  }, [refs, handler]);
}
票数 0
EN

Stack Overflow用户

发布于 2020-09-03 13:29:44

不确定,但试着做e.target as Element

代码语言:javascript
复制
const listener = (e: MouseEvent | TouchEvent) => {
 const elem = e.target as Element;
      const isValidElement = refs.some(ref => {
        if(!ref.current || ref.current.contains(e.target) || isInIgnoredElement(elem, ignoreClass)){ return true; }
      });
      !isValidElement && handler(e);
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63723421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档