打字稿:点击 'X' 没有成功关闭我的弹出横幅
Typescript: Clicking 'X' doesn't successfully close my popup banner
我使用以下代码创建了一个弹出式横幅(如果格式不正确,请见谅)
//this is in folder Banner.tsx
import React, {useCallback} from "react";
type Properties = {
close: () => void;
text: string;
const Banner: React.FC<Properties> = ({close, text}) => {
const onClick = useCallback(() => {
close();},
[close, text]);
return (
<div className = "BannerBox">
<div className = "banner">
<span className = "popup"> {onClick}{close}[x]
</span>
{text}
</div>
</div>
);
};
export default Banner;
//this is App.tsx
import Banner from "./Components/Banner";
function App(): JSX.Element {
const [isOpen, setIsOpen]=useState(false);
const toggleBanner = () => {
SetIsOpen(!isOpen);
};
return (
<div>
<input type = "button"
value = "popup"
onClick={toggleBanner}/>
<p>hi</p>
{isOpen && <Banner text = {"hello"} close={function (): void { throw new Error("Function not implemented.");
} }/>}
</div>
export default App;
//this is my Banner.css file (let me know if you need the full code but this is some of it)
.BannerBox{
position: fixed;
background: blue;
width:50%;
}
.banner{
position: relative;
width: 100%;
}
.popup{
content: 'x';
position: fixed;
background: green;
}
代码编译得很好,我没有收到任何错误,但问题是当横幅弹出窗口时,我无法通过单击将其关闭 'X' 我必须刷新页面为了关闭横幅,我不确定如何解决。感谢您的帮助!
假设 close()
实际上会关闭弹出横幅,因为您没有显示它的实现。
这一行导致了问题
<span className = "popup">{onClick}{close}[x]</span>
您应该将函数传递给 onClick
侦听器。类似于:
<span className = "popup" onClick={close}>[x]</span>
close
函数需要传递给充当按钮的 span 的 onClick 回调。这些被添加为 jsx 元素的“属性”。请参阅下面 onClick={onClick}
,其中您的 onClick 回调函数是通过引用传递的(注意没有在大括号内调用括号)
在returnBanner.tsx
<span className="popup" onClick={onClick}>
[x]
</span>
close 被传递到您的 Banner 组件中,因此这需要在您的 App 组件中实现。我通过将 isOpen 显式设置为 false(而不是调用切换)来确保它始终关闭
在App.tsx的return
{isOpen && <Banner text={"hello"} close={() => setIsOpen(false)} />}
总共
Banner.tsx
import React, { useCallback } from "react";
import "./Banner.css";
type Properties = {
close: () => void;
text: string;
};
const Banner: React.FC<Properties> = ({ close, text }) => {
const onClick = useCallback(() => {
close();
}, [close]);
return (
<div className="BannerBox">
<div className="banner">
<span className="popup" onClick={onClick}>
[x]
</span>
{text}
</div>
</div>
);
};
export default Banner;
和App.tsx
import React, { useState } from "react";
import Banner from "./Components/Banner";
function App(): JSX.Element {
const [isOpen, setIsOpen] = useState(false);
const toggleBanner = () => {
setIsOpen(!isOpen);
};
return (
<div>
<input type="button" value="popup" onClick={toggleBanner} />
<p>hi</p>
{isOpen && <Banner text={"hello"} close={() => setIsOpen(false)} />}
</div>
);
}
export default App;
查看代码和框 here
我使用以下代码创建了一个弹出式横幅(如果格式不正确,请见谅)
//this is in folder Banner.tsx
import React, {useCallback} from "react";
type Properties = {
close: () => void;
text: string;
const Banner: React.FC<Properties> = ({close, text}) => {
const onClick = useCallback(() => {
close();},
[close, text]);
return (
<div className = "BannerBox">
<div className = "banner">
<span className = "popup"> {onClick}{close}[x]
</span>
{text}
</div>
</div>
);
};
export default Banner;
//this is App.tsx
import Banner from "./Components/Banner";
function App(): JSX.Element {
const [isOpen, setIsOpen]=useState(false);
const toggleBanner = () => {
SetIsOpen(!isOpen);
};
return (
<div>
<input type = "button"
value = "popup"
onClick={toggleBanner}/>
<p>hi</p>
{isOpen && <Banner text = {"hello"} close={function (): void { throw new Error("Function not implemented.");
} }/>}
</div>
export default App;
//this is my Banner.css file (let me know if you need the full code but this is some of it)
.BannerBox{
position: fixed;
background: blue;
width:50%;
}
.banner{
position: relative;
width: 100%;
}
.popup{
content: 'x';
position: fixed;
background: green;
}
代码编译得很好,我没有收到任何错误,但问题是当横幅弹出窗口时,我无法通过单击将其关闭 'X' 我必须刷新页面为了关闭横幅,我不确定如何解决。感谢您的帮助!
假设 close()
实际上会关闭弹出横幅,因为您没有显示它的实现。
这一行导致了问题
<span className = "popup">{onClick}{close}[x]</span>
您应该将函数传递给 onClick
侦听器。类似于:
<span className = "popup" onClick={close}>[x]</span>
close
函数需要传递给充当按钮的 span 的 onClick 回调。这些被添加为 jsx 元素的“属性”。请参阅下面 onClick={onClick}
,其中您的 onClick 回调函数是通过引用传递的(注意没有在大括号内调用括号)
在returnBanner.tsx
<span className="popup" onClick={onClick}>
[x]
</span>
close 被传递到您的 Banner 组件中,因此这需要在您的 App 组件中实现。我通过将 isOpen 显式设置为 false(而不是调用切换)来确保它始终关闭
在App.tsx的return
{isOpen && <Banner text={"hello"} close={() => setIsOpen(false)} />}
总共
Banner.tsx
import React, { useCallback } from "react";
import "./Banner.css";
type Properties = {
close: () => void;
text: string;
};
const Banner: React.FC<Properties> = ({ close, text }) => {
const onClick = useCallback(() => {
close();
}, [close]);
return (
<div className="BannerBox">
<div className="banner">
<span className="popup" onClick={onClick}>
[x]
</span>
{text}
</div>
</div>
);
};
export default Banner;
和App.tsx
import React, { useState } from "react";
import Banner from "./Components/Banner";
function App(): JSX.Element {
const [isOpen, setIsOpen] = useState(false);
const toggleBanner = () => {
setIsOpen(!isOpen);
};
return (
<div>
<input type="button" value="popup" onClick={toggleBanner} />
<p>hi</p>
{isOpen && <Banner text={"hello"} close={() => setIsOpen(false)} />}
</div>
);
}
export default App;
查看代码和框 here