【发布时间】: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) => { setUsers(users.data.results); });,或者执行@iagowp 的回答之类的操作。您希望何时调用getUsers? -
@DrewReese,感谢您的评论兄弟,将检查以下修改后的解决方案..
标签: javascript reactjs api axios fetch