- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我的意思是,我有一个功能,在用户登录后,在一秒钟内将他/她导航到主页,例如:
const handleSignIn = async (e) => {
e.preventDefault();
const user = await signIn(formData);
if (user) {
toast.success('Signed In!');
setTimeout(() => {
navigate('/');
}, 1000);
} else {
toast.error('Bad user credentials!');
}
};
但是,我构建了一个 protected 路由,例如:
function App() {
const [user, setUser] = useState(null);
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
const unsubscribe = onAuthStateChanged(auth, (user) => {
setIsLoading(true);
if (user) {
setUser(user);
} else {
setUser(null);
}
setIsLoading(false);
});
return unsubscribe;
}, []);
if (isLoading) return <Spinner />;
return (
<>
<Router>
<Routes>
<Route path='/' element={<PrivateRoute />}>
<Route index element={<Explore />} />
<Route path='/offers' element={<Offers />} />
<Route path='/profile' element={<Profile />} />
<Route path='/contact/:landlordId' element={<Contact />} />
<Route path='/create-listing' element={<CreateListing />} />
<Route path='/category/:categoryName' element={<Category />} />
<Route path='/category/:categoryName/:id' element={<Listing />} />
</Route>
<Route
path='/sign-in'
element={!user ? <SignIn /> : <Navigate to='/' />}
/>
<Route
path='/sign-up'
element={!user ? <SignUp /> : <Navigate to='/' />}
/>
<Route
path='/forgot-password'
element={!user ? <ForgotPassword /> : <Navigate to='/' />}
/>
</Routes>
{user && <Navbar />}
</Router>
<ToastContainer autoClose={1000} />
</>
);
}
export default App;
所以这里的问题是,每当用户登录或注销时,onAuthStateChanged 都会被执行,因此它会强制应用重新呈现以了解谁登录和注销,然后相应地执行操作,例如限制某些路线并允许其他路线。
当用户登录时,我想显示一些 toast 消息,但它触发了应用程序级别的状态,在我显示 toast 和导航用户之前,由于限制,它会自动将用户导航到主页,我怎么能等在这样做之前的第二个?
最佳答案
你不能在调用 setUser()
之前等待 x 时间吗?这是因为 setUser()
更新了触发导航的 user
值。
useEffect(() => {
const unsubscribe = onAuthStateChanged(auth, (user) => {
setIsLoading(true);
setTimeout(() => {
if (user) {
setUser(user);
} else {
setUser(null);
}
setIsLoading(false);
}, 1000);
});
return unsubscribe;
}, []);
或者,使用带有自定义 wait
异步函数的 async/await 来避免嵌套:
const wait = async (d) => new Promise(r => setTimeout(d, r));
useEffect(() => {
const unsubscribe = onAuthStateChanged(auth, async (user) => {
setIsLoading(true);
await wait(1000);
if (user) {
setUser(user);
} else {
setUser(null);
}
setIsLoading(false);
});
return unsubscribe;
}, []);
关于javascript - 如何/等待一秒钟/在用户登录受限路线后导航?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70586121/
有什么办法(使用CSS)在最后一步之后将 Sprite 暂停一秒或多秒?我尝试再添加一个步骤或将相同的背景位置从 80% 增加到 100%,但没有成功。 .sprite { animation:
我正在使用 Flutter 创建一个新应用,并想在初始启动画面上添加自定义图像。 图像出现在初始屏幕上,但是在大约半秒钟内它看起来被拉伸(stretch)了,看起来不太好。 我一直在寻找,但一直找不到
我有一个状态: state = { showView: false, } 如何创建一个函数,在调用时将 showView 状态更改为 true 1 秒,然后将其更改回 false? 最佳答案 this
我有一个平滑的滚动效果: jQuery('html,body').animate({scrollTop:scrollTarget}, 1000, "swing"); 它工作正常,但是当按下多个元素时,
我似乎遇到了与我之前发布的问题相同的问题。我想隐藏默认情况下存在的所有 div,只显示一个。然后用户可以单击一个侧面选项卡以显示另一个。问题是 div 在页面加载后仅隐藏一秒钟,但很快就会重新出现。这
我是一名优秀的程序员,十分优秀!