为什么我得到两个控制台日志,而它应该只有一个?反应 js
Why do I get two console logs while its should be just one ? react js
我在 React 中有一个简单的部分,其中包含两个按钮徽标和横幅,单击时我从 Web 组件打开一个简单的模式,现在我希望当用户单击取消时在控制台上显示一些内容。
问题:当我单击打开模式的徽标按钮并单击取消时,我得到了我想要的控制台日志,然后单击横幅按钮并打开模式并单击取消,而不是仅提供日志与横幅按钮相关,我得到了两个日志。
我的代码现场演示:live demo
import * as element from "./custom-element";
const Images = () => {
const [imgName, setImgName] = useState();
const [logo, setLogo] = useState();
const [banner, setBanner] = useState();
const elementRef = useRef(null);
const handleUseImage = () => {
switch (imgName) {
case "logo":
console.log("logo name", imgName);
break;
case "banner":
console.log("banner name", imgName);
break;
default:
}
};
useEffect(() => {
if (imgName) {
elementRef.current.addEventListener("cancel", function (e) {
handleUseImage(e);
});
}
}, [imgName]);
const handleLogo = () => {
setImgName("logo");
openModal();
};
const handleBanner = () => {
setImgName("banner");
openModal();
};
const openModal = () => {
elementRef.current.visible = true;
};
return (
<div className="App">
<custom-element ref={elementRef}></custom-element>
<button onClick={handleLogo}>Logo </button>
<button onClick={handleBanner}>Banner </button>
<span>Logo url: {logo} </span>
<span>banner url: {banner} </span>
</div>
);
};
export default Images;
[][2
为什么我得到两个日志?
我可能是错的,但我很确定问题是你永远不会删除事件侦听器,所以当你调用 setImgName
时它会重新呈现,现在你将拥有 两个 事件侦听器,一个“超出范围”(因为缺少更好的术语 - 它没有“当前”状态值,因为它来自以前的渲染)。我会尝试
useEffect(() => {
if (imgName) {
elementRef.current.addEventListener("cancel", handleUseImage);
return () => {
elementRef.current.removeEventListener("cancel", handleUseImage);
}
}
}, [imgName]);
我在 React 中有一个简单的部分,其中包含两个按钮徽标和横幅,单击时我从 Web 组件打开一个简单的模式,现在我希望当用户单击取消时在控制台上显示一些内容。
问题:当我单击打开模式的徽标按钮并单击取消时,我得到了我想要的控制台日志,然后单击横幅按钮并打开模式并单击取消,而不是仅提供日志与横幅按钮相关,我得到了两个日志。
我的代码现场演示:live demo
import * as element from "./custom-element";
const Images = () => {
const [imgName, setImgName] = useState();
const [logo, setLogo] = useState();
const [banner, setBanner] = useState();
const elementRef = useRef(null);
const handleUseImage = () => {
switch (imgName) {
case "logo":
console.log("logo name", imgName);
break;
case "banner":
console.log("banner name", imgName);
break;
default:
}
};
useEffect(() => {
if (imgName) {
elementRef.current.addEventListener("cancel", function (e) {
handleUseImage(e);
});
}
}, [imgName]);
const handleLogo = () => {
setImgName("logo");
openModal();
};
const handleBanner = () => {
setImgName("banner");
openModal();
};
const openModal = () => {
elementRef.current.visible = true;
};
return (
<div className="App">
<custom-element ref={elementRef}></custom-element>
<button onClick={handleLogo}>Logo </button>
<button onClick={handleBanner}>Banner </button>
<span>Logo url: {logo} </span>
<span>banner url: {banner} </span>
</div>
);
};
export default Images;
[
为什么我得到两个日志?
我可能是错的,但我很确定问题是你永远不会删除事件侦听器,所以当你调用 setImgName
时它会重新呈现,现在你将拥有 两个 事件侦听器,一个“超出范围”(因为缺少更好的术语 - 它没有“当前”状态值,因为它来自以前的渲染)。我会尝试
useEffect(() => {
if (imgName) {
elementRef.current.addEventListener("cancel", handleUseImage);
return () => {
elementRef.current.removeEventListener("cancel", handleUseImage);
}
}
}, [imgName]);