【问题标题】:Best way to fetch the data from API从 API 获取数据的最佳方式
【发布时间】:2021-07-17 06:05:02
【问题描述】:

我正在制作一个简单的反应应用程序,我需要在选择下拉列表中显示用户列表。

这个用户列表来自api。

所以我在我的应用程序中使用了 Context API,我已经创建了一个上下文并在上下文中进行了 api 调用。

context.js

import React from "react";
import axios from "axios";

export const UserContext = React.createContext();

export function Provider({ children }) {
  const getUsers = () => {
    return axios.get(`https://randomuser.me/api/?results=10`).then((res) => {
      return res;
    });
  };

  return (
    <UserContext.Provider value={{ usersList: getUsers() }}>
      {children}
    </UserContext.Provider>
  );
}

users.js

-> 仅包括已获取用户数据的上下文,并将react-select 包含在下拉列表中。

-> 使用useContext 获取承诺值并在useEffect 内部挂钩获取响应并将其存储在状态变量setUsers

-> 在渲染方法中返回选择框值,并将获取的用户列表作为下拉列表。

import React, { useContext, useEffect, useState } from "react";
import Select from "react-select";
import { UserContext } from "../context";

const Users = () => {
  const { usersList } = useContext(UserContext);

  const [users, setUsers] = useState([]);

  const getUsers = () => {
    usersList.then((users) => {
      setUsers(users.data.results);
    });
  };

  useEffect(() => {
    getUsers();
  }, []);

  return (
    <div>
      <p> Below user list in select box is called from API </p>
      <Select
        value={""}
        name="user"
        options={users}
        getOptionLabel={(option) => option.name.first}
        getOptionValue={(option) => option.id.value}
        className="basic-multi-select"
      />
    </div>
  );
};

export default Users;

工作示例:

查询:

->这很好用但是在我的实际应用程序中这会导致multiple api calls

-> 我已经检查了网络选项卡,它已经被调用了至少 50 次,我觉得这将是一个关于性能的大问题。

所以我想知道是否有更好和标准的方法来实现这一点,以避免内存泄漏和多次调用 api 获取?

我怀疑这条线是否,

<UserContext.Provider value={{ usersList: getUsers() }}>

导致真正的问题,因为我用括号 () 调用 getUsers() 方法,但如果我删除它,它不会被执行..

请帮助我并提前感谢..

【问题讨论】:

  • 让它异步并等待它?
  • 我认为您在此处显示的用户和提供者工作正常。让我们退后一步,检查一下您调用 Provider 组件的位置。是否有任何错误导致 Provider 组件被多次挂载和卸载?
  • 从我在这里和你的代码和框中看到的,getUsers 只有在Provider 被重新渲染时才会被调用,并且由于Provider 将所有内容都包装在App 中,它只会如果您的整个应用程序被重新渲染,则永远不会被调用。您可以立即调用getUsers,而只是在组件安装时调用Users,即usersList().then((users) =&gt; { setUsers(users.data.results); });,或者执行@iagowp 的回答之类的操作。您希望何时调用 getUsers
  • @DrewReese,感谢您的评论兄弟,将检查以下修改后的解决方案..

标签: javascript reactjs api axios fetch


【解决方案1】:

您可以将用户列表存储在一个数组中,并让您的组件在挂载时调用getUsers。然后在需要的地方使用users

export function Provider({ children }) {
  const [users, setUsers] = useState([]);
  const getUsers = () => {
    if (!users.length) {
      axios.get(`https://randomuser.me/api/?results=10`).then((res) => {
        setUsers(res.data.results);
      });
    }
  };

  return (
    <UserContext.Provider value={{ usersList: users, getUsers }}>
      {children}
    </UserContext.Provider>
  );
}

在 User.js 上

const Users = () => {
  const { usersList, getUsers } = useContext(UserContext);

  useEffect(() => {
    getUsers();
  }, [getUsers]);

  return (
    <div>
      <p> Below user list in select box is called from API </p>
      <Select
        value={""}
        name="user"
        options={users}
        getOptionLabel={(option) => option.name.first}
        getOptionValue={(option) => option.id.value}
        className="basic-multi-select"
      />
    </div>
  );
};

【讨论】:

  • 这给出了空的 userList 数组 codesandbox.io/s/react-context-api-forked-v31k5
  • @Undefined 您需要在组件中获取getUsers,并在useEffect 中调用它,并使用空数组进行依赖
  • @Undefined 我已将答案更改为更完整
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
相关资源
最近更新 更多