gpt4 book ai didi

javascript - 检测组件外部 react 钩子(Hook)的点击

转载 作者:行者123 更新时间:2023-12-03 13:39:35 24 4
gpt4 key购买 nike

我正在尝试使用 react Hook 来确定用户是否单击了元素外部。我正在使用 useRef 来获取对该元素的引用。

谁能看看如何解决这个问题。我收到以下错误并关注 answers from here .

Property 'contains' does not exist on type 'RefObject'

上面的错误似乎是 typescript 问题。

有一个code sandbox here有不同的错误。

在这两种情况下都不起作用。

import React, { useState, useEffect, useRef } from 'react';
import ReactDOM from 'react-dom';

const Menu = () => {
const wrapperRef = useRef<HTMLDivElement>(null);
const [isVisible, setIsVisible] = useState(true);

// below is the same as componentDidMount and componentDidUnmount
useEffect(() => {
document.addEventListener('click', handleClickOutside, true);
return () => {
document.removeEventListener('click', handleClickOutside, true);
};
}, []);


const handleClickOutside = event => {
const domNode = ReactDOM.findDOMNode(wrapperRef);
// error is coming from below
if (!domNode || !domNode.contains(event.target)) {
setIsVisible(false);
}
}

return(
<div ref={wrapperRef}>
<p>Menu</p>
</div>
)
}

最佳答案

useRef API应该这样使用:

import React, { useState, useRef, useEffect } from "react";
import ReactDOM from "react-dom";

function App() {
const wrapperRef = useRef(null);
const [isVisible, setIsVisible] = useState(true);

// below is the same as componentDidMount and componentDidUnmount
useEffect(() => {
document.addEventListener("click", handleClickOutside, false);
return () => {
document.removeEventListener("click", handleClickOutside, false);
};
}, []);

const handleClickOutside = event => {
if (wrapperRef.current && !wrapperRef.current.contains(event.target)) {
setIsVisible(false);
}
};

return (
isVisible && (
<div className="menu" ref={wrapperRef}>
<p>Menu</p>
</div>
)
);
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

关于javascript - 检测组件外部 react 钩子(Hook)的点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54391682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com