如何将 setTimeout 与 Loader 一起使用
How to use setTimeout with a Loader
我有一个简单的功能组件,我单击一个按钮并显示它,我试图让我导入的微调器在单击按钮时显示 2 秒,然后在两秒后显示我导入的组件,但是我只能在单击按钮后 2 秒让微调器显示并且无法让它停止
import React, { useState } from "react";
import Hello from "./Hello";
import Spinner from '../Spinner/Spinner'
import "./styles.css";
export default function App() {
const [show, setShow] = useState(false);
const [loading, setLoading] = useState(false);
const helloHandeler = () => {
setTimeout(() => {
setLoading(!loading)
}, 2000)
setShow(!show);
};
if (loading) return <Spinner />
return (
<div className="App">
<h1>Adding a Spinner</h1>
<div className="bodyContainer">
{!show && <button onClick={helloHandeler}>Click me</button>}
{show && <Hello />}
</div>
</div>
);
}
当您触发 helloHandeler()
时,它会记录 setTimeout()
仅在两秒后启动!这是 setTimeout()
.
的行为
相反,您应该立即 setLoading()
,然后 setTimeout
2 秒后停止加载。也许你还想在两秒后 setShow()
,所以把它放在 setTimeout()
.
里面
更新
此外,请记住 JS 是异步工作的,因此,当您注册 setTimeout 时,loading
还不是 true
。
const helloHandeler = () => {
setLoading(true)
setTimeout(() => {
setLoading(false)
setShow(!show);
}, 2000)
};
您可以添加 useEffect
挂钩来更新 DOM。
您只是在更新处理程序中的 loading
标志。 React 不知道它需要更新 DOM.
useEffect(() => {
if (loading) {
setTimeout(() => {
setLoading(false);
}, 2000);
}
}, [loading]);
我有一个简单的功能组件,我单击一个按钮并显示它,我试图让我导入的微调器在单击按钮时显示 2 秒,然后在两秒后显示我导入的组件,但是我只能在单击按钮后 2 秒让微调器显示并且无法让它停止
import React, { useState } from "react";
import Hello from "./Hello";
import Spinner from '../Spinner/Spinner'
import "./styles.css";
export default function App() {
const [show, setShow] = useState(false);
const [loading, setLoading] = useState(false);
const helloHandeler = () => {
setTimeout(() => {
setLoading(!loading)
}, 2000)
setShow(!show);
};
if (loading) return <Spinner />
return (
<div className="App">
<h1>Adding a Spinner</h1>
<div className="bodyContainer">
{!show && <button onClick={helloHandeler}>Click me</button>}
{show && <Hello />}
</div>
</div>
);
}
当您触发 helloHandeler()
时,它会记录 setTimeout()
仅在两秒后启动!这是 setTimeout()
.
相反,您应该立即 setLoading()
,然后 setTimeout
2 秒后停止加载。也许你还想在两秒后 setShow()
,所以把它放在 setTimeout()
.
更新
此外,请记住 JS 是异步工作的,因此,当您注册 setTimeout 时,loading
还不是 true
。
const helloHandeler = () => {
setLoading(true)
setTimeout(() => {
setLoading(false)
setShow(!show);
}, 2000)
};
您可以添加 useEffect
挂钩来更新 DOM。
您只是在更新处理程序中的 loading
标志。 React 不知道它需要更新 DOM.
useEffect(() => {
if (loading) {
setTimeout(() => {
setLoading(false);
}, 2000);
}
}, [loading]);