javascript - react : Am I using conditional rendering wrongly as it seems to not evaluate as expected?

标签 javascript reactjs conditional-statements react-hooks session-storage

我有一个小应用程序,我想为登录的用户/管理员帐户以不同的方式呈现组件。

例如对于普通用户,我希望有标题菜单“User1”和“User2”,对于管理员用户“Admin1”,“Admin2”,...

在登录屏幕上,输入信息存储在 session 存储中的“AuthHelper”类中。 管理员用户的名称必须为“admin”,否则将作为普通用户处理(用于测试目的)

export default class AuthHelper {


    login = (username, password, cb) => {

        window.sessionStorage.setItem("username", username)
        window.sessionStorage.setItem("password", password)
        let isAdmin = username.includes("admin") ? true:false

        window.sessionStorage.setItem('adminState', isAdmin)

        setTimeout(() => {
            cb()
        }, 100);
    }

    logout = (cb) => {
            window.sessionStorage.clear()
            setTimeout(() => {
                cb()
            }, 100);

    }

    isLoggedIn = () => {
        if (window.sessionStorage.getItem('username') == null) {
            return false
        }
        return true
    }

    isAdmin = () => {
        return window.sessionStorage.getItem('adminState')
    }
}

在 App.js 中,我首先想仅为登录的管理员用户呈现标题菜单:

function App() {
  const auth = new AuthHelper()
  const [isLoggedIn, setIsLoggedIn] = useState(false)

 useEffect(() => {

 })

  return (
    <div>
      <BrowserRouter>
        <header>
          <div className="header-title">
            <h1>Service</h1>
          </div>
          <div className="header-links">
          {
              //window.sessionStorage.getItem('adminState') && 
              auth.isAdmin() &&
              (
              <ul className="menu-list">
                <Link to="/overview">Admin1</Link>
                <Link to="/order">Admin2</Link>
                <Logout setIsLoggedIn={setIsLoggedIn} />
              </ul>
             )
          }
          </div>
          ...

但是,即使登录控制台时(如普通用户登录)auth.isAdmin() 正确返回 false,菜单 始终显示。我在这里缺少什么?我将如何继续根据用户登录状态显示不同的标题菜单?

此外,“Auth”方法中的回调函数是否需要延迟100毫秒,还是实际上没有意义?传递的“cb”函数调用App.js传递的setter钩子(Hook)“setIsLoggedIn”来实现App.js整体的重新渲染以显示菜单。将钩子(Hook) setter 传递给它们并调用它们来触发合法的重新渲染还是一个坏主意?

很高兴收到任何建议和反馈!

最佳答案

很可能在 session 存储中所有值都保存为字符串:字符串“true”或字符串“false”,并且当您将字符串转换为 bool 类型时,字符串始终返回 true,因此只需更改条件即可

isAdmin = () => {
  return window.sessionStorage.getItem('adminState') === 'true'
}

它应该可以工作

关于javascript - react : Am I using conditional rendering wrongly as it seems to not evaluate as expected?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59275208/

相关文章:

reactjs - 无法在不稳定的 getServerSession 处读取未定义的属性(读取 'secret' )

javascript - 如何向 Javascript 添加条件语句(使用元素 ID 作为条件)?

javascript - 使用 Mocha 和 Sinon 测试 anchor 链接调用

javascript - 使用 Electron 时,设计 HTML/CSS 布局的最佳方式是什么?

javascript - 动态地将脚本注入(inject)<head>?

android - React Native for Android 中的依赖错误

Mysql 有条件更新其他表的值

excel - 在特殊条件下将一系列单元格粘贴到相同大小的目标范围?

javascript - 为什么 PHP 会忽略 JSON 中的空对象?

javascript - 匹配字符串中存在的定义标签