我尝试在我的Web应用程序中实现一个导航栏功能,它应该根据redux状态中的布尔值切换呈现的信息。现在,当用户未登录时,使用我的used选择器获取的对象是空的,这意味着它是一个真实的值,因此不允许我如我所愿地切换navabr上的元素。有没有办法做到这一点,而不修改我的redux状态?
先谢谢你。
import './App.css';
import { Route, Routes, Link, Redirect, Navigate } from "react-router-dom";
import { useEffect, useState } from 'react';
import { useSelector } from 'react-redux';
import SearchBar from "./components/searchBar";
import Main from './components/main';
import Login from './components/login';
import Register from './components/register';
let linkStyle = { textDecoration: "none", color: "white" };
function App() {
// fetching redux status
let user = useSelector(state => state.loginStatus.user)
let loginStatus = useSelector(state => state.loginStatus.isLoggedIn)
console.log(loginStatus)
const [isActive, setIsActive] = useState(false);
const [isLoggedIn, setIsLoggedIn] = useState(false);
const [avatar, setAvatar] = useState({});
useEffect(() => {
if (loginStatus) {
setIsLoggedIn(loginStatus)
setAvatar(user)
}
}, [loginStatus, isLoggedIn, isActive, avatar])
return (
<div className="App">
<nav className="navbar">
<div className="logo"><Link to={'/'} onClick={() => setIsActive(false)}><img src='https://cdn-icons-png.flaticon.com/512/201/201623.png' /></Link></div>
<h1 className="title">Travel.com</h1>
{
isLoggedIn && (<ul className='menu'>
<li className="link"><Link style={linkStyle} to='/login' onClick={() => setIsActive(true)}>Log-in</Link></li>
<li className="link"><Link style={linkStyle} to='/register' onClick={() => setIsActive(true)}>Register</Link></li>
</ul>)
}
{ /*
isLoggedIn && (
<div className="avatar">
<h6> Hi avatar.user_name!</h6>
</div>
) */
}
</nav>
1条答案
按热度按时间lrpiutwd1#
如果我没理解错你的问题,那么一个简单的解决方案就是使用类似下面这样的方法来检查对象是否为空:
Boolean(Object.keys(logInStatus).length)
如果logInStatus
是空对象,则返回false
;如果logInStatus
有任何属性,则返回true
。您可以在useEffect()中将其作为参数传递给setIsLoggedIn()
。你说你不想改变Redux存储,但是我会质疑
isLoggedIn
属性的命名。以is
开头的属性的名称暗示它是一个布尔值。或者至少它会强制转换成一个对应于它的名字的布尔值。这是一个需要注意的问题,因为有些人不如果对代码库不太了解,很可能会根据约定做出假设,从而导致这样的情况,代码的行为与您的预期相反。