我的React应用程序遇到了一个奇怪的问题. 这是一个模拟乙烯基store ,现在我正在研究"以前的订单"功能.我在useEffect块中向我的后端发送一个GET请求和我的令牌,并设置订单的状态.我通过上下文包装器获取的令牌本身. 然后我的组件应该呈现结果. 代码如下:

import { useContext, useEffect, useState } from 'react'

import AuthContext from '../context/AuthContextProvider';

import { fetchAllOrders } from '../api/api';
import OrderDetails from './OrderDetails';


export const Orders = () => {
    const authCtx = useContext(AuthContext);
    const token = authCtx.loggedInUserData.auth_token
    const [orders, setOrders] = useState({});

    useEffect(() => {
        async function getAllOrders() {
            console.log("effect ran", token)
            const response = await fetchAllOrders(token);
            console.log(response)

            setOrders(response);
            // setOrders(response.data);       // when using axios
        }

        getAllOrders();
    }, [token]);

    console.log(orders)
    return (
        <main>
            {orders.length > 0 && { token } && <div>
                {orders.map(order =>
                    <OrderDetails key={order.id} order={order} />
                )}
            </div>
            }
        </main>
    )

}

令人费解的是,该组件按预期工作,并在我从应用程序本身访问数据时呈现数据.API调用访问了正确的端点,身份验证中间件成功传递,响应格式正确,最终显示在我的FE上.

successful api call and rendering results

然而,一旦我刷新选项卡或直接在地址栏http://localhost:3001/orders中键入,我就会收到401错误.

401 error - page rendering before response is received

如您所见,在第二个实例中,效果在令牌被获取并发送到API之前运行,因此是401响应.为什么会发生这种事? 同样,在抛出错误之后,我似乎得到了预期的响应,但很明显,到那时应用程序已经崩溃了.一旦我添加了适当的错误处理,这可能就不再是问题了? 我只是不明白为什么这款应用在这两种情况下会有不同的表现. 顺便说一句,整个app could be found here,因为可能有其他移动部件影响这一功能.

推荐答案

获取数据没有任何条件,它是不受token值限制的.您可能希望修改该效果,使其仅在定义了令牌值时才发出FETCH请求.

此外,当呈现结果时,{ token }是一个对象,因此它将是真实的102,当(A)存在要呈现的结果并且(B)用于获取结果的真实令牌时,使用just token来有条件地帮助结果.

如果orders是数组,则101应该是数组类型.这是为了维护一个易于推理的状态不变量.

示例:

export const Orders = () => {
  const authCtx = useContext(AuthContext);
  const token = authCtx.loggedInUserData.auth_token;

  const [orders, setOrders] = useState([]); // <-- array invariant

  useEffect(() => {
    async function getAllOrders() {
      const response = await fetchAllOrders(token);
      setOrders(response);
    }

    if (token) {
      getAllOrders(); // <-- only fetch orders if truthy token
    }
  }, [token]);

  return (
    <main>
      {!!orders.length && token && (
        <div>
          {orders.map(order =>
            <OrderDetails key={order.id} order={order} />
          )}
        </div>
      )}
    </main>
  );
};

Reactjs相关问答推荐

如何等待我的插入内容提交后再继续执行指令?

如何使用react-router-dom导航到网页中的其他路由?

TypeError:SearchProduct.get()获得了意外的关键字参数查询'

react 路由GUGUD Use Effect无法通过useNavigate正常工作

NextJS如何正确保存添加到购物车中的产品会话

在url中使用MongoDB对象ID被认为是不好的做法?

是否为Reaction中未使用的组件生成Tailwincss样式?

无法找出状态正在被更改的位置

React-React中是否完全支持基于类的组件?

React组件未出现

我发送的 prop 的值不会改变.如果成功登录,导航栏中的 prop 必须为 true.我从后端得到 200 ok

预期无限重新渲染但没有发生

React 状态不更新

FlatList 不在 React Native 中呈现项目

Select 项目后 Select HeadlessUI 组合框中的所有文本?

React Three Fiber mesh 标签在此浏览器中无法识别

如何使用 React 在客户端获取 nestjs websocket 异常错误?

我应该使用 useEffect 来为 React Native Reanimated 的 prop 值变化设置动画吗?

在 Redux 中更新布尔状态时出错

错误未捕获的错误:[App] 不是 组件. 的所有子组件必须是