我无法在功能性 React 组件中使用带有 useEffect 的内联“if”吗?

IT技术 javascript reactjs typescript react-hooks
2022-07-23 02:21:20

我目前正在尝试使用 Okta 的 React SDK 来使用 TypeScript 使用 React 构建应用程序,并且我选择使用功能组件而不是基于类的组件。

因此,我在根据用户的身份验证状态呈现我的应用程序菜单的一部分时遇到问题。该文档显示使用useEffect()获取用户的身份验证状态,然后使用useState()基于该状态存储用户信息。

这在实践中似乎很合乎逻辑,也是一个好主意,但是当我尝试使用以下组件时:

import React, { useState, useEffect } from 'react';
import { Dropdown } from 'semantic-ui-react';
import { useOktaAuth } from '@okta/okta-react';

export const HeaderUserMenu = () => {

    // Okta Hook, State
    const { authState, oktaAuth } = useOktaAuth();
    const [ userInfo, setUserInfo ] = useState(null);

    // Get info when our state/etc update with this.
    useEffect(() => {
        if (!authState.isAuthenticated) {
            setUserInfo(null);
        } else {
            oktaAuth.token.getUserInfo()
                .then((info: any) => setUserInfo(info))
        }
    }, [authState, oktaAuth])

    return (
        { userInfo && 
            <Dropdown.Menu item text={userInfo.username}>
                <Dropdown.Item>Log Info</Dropdown.Item>
            </Dropdown.Menu>
        }
    )    

}

我收到两个错误:

',' expected.- 这是指向使用&&操作符来检查userInfo(是否为空?)这个组件的条件渲染。

Object is possibly 'null'.- 这是指向userInfo.username在条件渲染的东西里面的使用。逻辑的重点是仅在 userInfo 不为 null 时进行渲染所以此时userInfo不能为 null,对吗?

我不确定我在这里做错了什么。

我觉得它与. 有关系useEffect,但我想我可能是错的,我仍然有点习惯在 React 中使用钩子,即使我以前用过useState,我从来没有使用过效果,直到现在。

提前致谢!

2个回答

',' 预期的。- 这指向使用 && 运算符来检查 userInfo(它是否为空?)以获取此组件的条件渲染。

图案:

{ userInfo && 

代码中的位置{表示“对象文字的开始”而不是“将值插入 JSX”,因为您尚未使用<.

不要将该表达式包含在{}


对象可能为“空”。- 这指向在条件渲染的内容中使用 userInfo.username。逻辑的重点是仅在 userInfo 不为 null 时进行渲染,所以此时 userInfo 不能为 null,对吗?

您正在测试是否userInfo.username具有真实值。

错误是因为userInfo它本身可能是null.

尝试访问(null).username将引发异常。

在测试它是否有属性之前测试是否userInfo有一个值username

我可以通过为 userInfo 声明一个接口来解决这个问题,该接口将存储在组件状态中。

我还必须!authState在 useEffect 开始时检查。

这样做之后,我null用一个空对象替换,现在我只是通过Object.keys(userInfo).length).

它似乎工作正常,并且没有报告错误。