配置文件/视图.js

const ViewProfile = () => {
    const router = useRouter();

    //Working as expected
    const user = useUserData();
    console.log(user);

    //unable to fetch this
    const data = user.profile;
    console.log(data);

    //Rest of the code
}

这是我的ViewProfile组件.每当我通过useUserData钩子获取用户数据时,我都可以毫无问题地记录User对象.但是,只要我try 访问User.Profile对象,就会收到错误Cannot read properties of null (reading 'profile').

使用UserData.js

import Cookies from "js-cookie";
import { useEffect, useState } from "react";

const useUserData = () => {
    const userToken = Cookies.get("sessionToken");
    const [userData, setUserData] = useState(null);

    useEffect(() => {
        async function fetchData() {
            try {
                const res = await fetch(`${process.env.NEXT_PUBLIC_SERVER_URI}/user/profile`,{
                    method: "GET",
                    headers: {
                        "Content-Type": "application/json",
                        "Authorization": `Bearer ${userToken}`,
                    },
                });

                const data = await res.json();
                if (res.ok) {
                    setUserData(data);
                }
            } catch (err) {
                console.error(err);
            }
        }
    
        if (userToken) {
            fetchData();
        }

    }, [userToken]);

    return userData;
};

export default useUserData;

当我记录用户对象时,配置文件对象也存在.我一记录配置文件对象,问题就出现了. 我已经判断了API,它工作正常.我认为我的useEffect实现有一些问题. 如有任何帮助,我们不胜感激.

推荐答案

您需要了解Reaction如何呈现组件,基本上每次组件的状态改变时它都会重新呈现.以下是来自组件+挂钩的流:

  • 首先,您的组件使用状态userData = null呈现,这是状态的初始值,这意味着在本例中,user对象是null,也就是您遇到问题的位置
  • 一旦端点为您返回值,并且您已经设置了新的状态userData,user对象就变成了您需要的对象,即已定义的对象

因此,您需要处理user可以为空的情况,例如:

if (!user) {
   // show loading state
   return <Loading />
}

// now display the user information

Reactjs相关问答推荐

每次单击按钮时,Reaction组件都会重新生成

在Reaction中管理多个状态

页面永远加载API/从数据库获取数据

无法在 NextJS 中获取嵌套对象

当 URL 与我声明的任何路由都不匹配时,如何使用不会重定向到错误页面的动态 URL? - react 路由 dom

从 redux 调用UPDATE_DATA操作时状态变得未定义

获取更多数据后更新 DOM,而不刷新 React.js 中的页面

数据表格组件需要所有行都具有唯一的ID属性.或者,您可以使用getRowId属性.

无法在react 中向表中添加行

无法设置 null 的属性(设置src)

为嵌套路由配置一个不存在的 url 的重定向

如何使用 React Hook Form 将寄存器作为 props 发送到子组件来收集数据?

单击按钮或文本从一个组件移动到另一个组件

谁能根据经验提供有关 useEffect 挂钩的更多信息

react 页面更新

将 Material UI 菜单渲染为

在 React 中使用使用状态挂钩合并两个数组

如果两个组件在 React 中导入相同的 CSS 文件会发生什么?

在渲染不显示子元素之后,再次渲染时,子元素状态数据完全消失了.为什么会这样以及如何防止它发生?

react / firebase 基地.如何在我的项目中保存更新的数据?