当前位置: 首页 > 知识库问答 >
问题:

useFetch自定义钩子以某种方式返回数据两次如何修复?

凤修筠
2023-03-14

就像标题说的useFetch自定义钩子,我做了两次返回数据,我的意思是什么。当我console.log我获取的数据有两个输出,其中一个是空值,另一个是我想要的数据,因为有空值的数据,这是一个问题,因为我不能实现包含我想要的数据的表。下面是代码:

import { useState, useEffect } from "react";
import axios from "axios";
const useFetch = (url) => {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(null);

  useEffect(() => {
    setLoading(true);
    axios
      .get(url)
      .then((response) => {
        setData(response.data);
      })
      .catch((err) => {
        setError(err);
      })
      .finally(() => {
        setLoading(false);
      });
  }, [url]);

  return { data, loading, error };
};

export default useFetch;

这就是我想使用我获取的数据的地方:

import React from "react";
import Table from "@mui/material/Table";
import TableBody from "@mui/material/TableBody";
import TableCell from "@mui/material/TableCell";
import TableContainer from "@mui/material/TableContainer";
import TableHead from "@mui/material/TableHead";
import TableRow from "@mui/material/TableRow";
import useFetch from "./custom_hooks/useFetch";

const TableComponent = () => {
  const { data, loading, error } = useFetch(
    "https://gorest.co.in/public/v1/users?page=1"
  );

  if (loading) return <h1> LOADING...</h1>;

  if (error) console.log(error);

  console.log(data);

  return (
    <TableContainer>
      <Table>
        <TableHead>
          <TableRow>
            <TableCell>User Names</TableCell>
            <TableCell align="right">Email</TableCell>
            <TableCell align="right">Status</TableCell>
            <TableCell align="right">Gender</TableCell>
            <TableCell align="right">ID</TableCell>
          </TableRow>
        </TableHead>
        <TableBody>
          {data.data.map((user) => {
            return (
              <TableRow>
                <TableCell>{user.name}</TableCell>
              </TableRow>
            );
          })}
        </TableBody>
      </Table>
    </TableContainer>
  );
};

export default TableComponent;

当我刷新页面时,有一个错误“数据为空”,如何修复?

共有1个答案

云承弼
2023-03-14

你的钩子不能很好地管理它的内部状态。例如,如果读取错误,它永远不会取消错误。)此外,如果您更改了URL,钩子可能会因为先前的效果先完成而导致错误URL的数据。

因此,最好只查看您是否有数据,而不要相信其他标志是正确的:

const { data, loading, error } = useFetch("https://gorest.co.in/public/v1/users?page=1");
if(error) return <>Error: {String(error)}</>;
if(!data) return <h1>LOADING...</h1>;

除此之外,您可能还想查看一个为您正确执行状态管理、缓存等操作的库;在撰写本文时,我建议swrreact query。。。

 类似资料:
  • 我目前正在尝试创建一个钩子,跟踪给定组件中所有子组件上的道具(当一个子组件切换时,其他子组件取消切换) 我这样做的方式是: 通过创建与子节点长度相同的假值列表来设置初始状态 将此状态映射到每个子的prop 声明并返回操作初始列表状态的切换函数 当我调用toggle时,会出现以下错误: 警告:来自useState()和useReucer()钩子的状态更新不支持第二个回调参数。若要在呈现后执行副作用,

  • TL;DR:如何选择一个WP REST API自定义endpoint的响应的每一点信息? 长版 如果我想使用WP REST API构建自定义endpoint - 从不同的帖子类型发送特定帖子数据 - 按照手册中的示例,我得到了这个: 但是get_post()函数没有返回一些数据,如果您希望在页面中显示帖子,这些数据是非常有用的(例如类别id、特色图片)。那么,我如何构建一个自定义endpoint来

  • 本文向大家介绍django rest framework 自定义返回方式,包括了django rest framework 自定义返回方式的使用技巧和注意事项,需要的朋友参考一下 大家在用Django Rest Framework的时候会发现默认继承后,增删改查的返回信息都是一段data,这是因为我实际是状态码和信息你在调用api的时候是看不到的,仅仅如此么?并不是这样,在我前端调用后端的时候,实

  • 这是“Eloquent JavaScript”书中的一个例子(我想你知道这本书): 代码做什么并不重要。 问题是:据我所知,函数有两个不同的'body',即它做完全不同的事情。在第一个实例中,它做了很多逻辑,但第二次它,首先,有一个不同的第二个参数(而不是,其次,它只是将一个数组元素属性(即39人数组中一个人的死亡日期)除以100。 为什么同一个函数做不同的事情?我确实理解 同一个函数的这两个实例

  • 我有一个组件,我在其中调用我的自定义钩子。 自定义钩子如下所示: 而我在其中使用的导致错误的组件是: 有什么想法吗?

  • 和其它版本控制系统一样,Git 能在特定的重要动作发生时触发自定义脚本。 有两组这样的钩子:客户端的和服务器端的。 客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。 你可以随心所欲地运用这些钩子。 安装一个钩子 钩子都被存储在 Git 目录下的 hooks 子目录中。 也即绝大部分项目中的 .git/hooks 。 当你用 git init 初始