我看不到您的 API 调用或 HoldingDetailsContainer 的详细信息,也看不到您的导入,但下面是使用 Context API + Hooks + 函数组件获取的完整(人为)示例通过 REST API 获取数据并将其提供给组件:
// App.jsx
import React from "react";
import { APIContextProvider } from "./apiContext";
import Users from "./Users";
export default function App() {
return (
// wrap your app (or just components that need to consume the context)
<APIContextProvider>
<div className="App">
<h1>Hello CodeSandbox</h1>
// the Users component sits below the Provider so can consume its context
<Users />
</div>
</APIContextProvider>
);
}
// apiContext.jsx
import React, { useContext, useState, useEffect, createContext } from "react";
import axios from "axios";
const APIContext = createContext();
export function APIContextProvider({ children }) {
// for more complex state you might set up useReducer for Redux-like state updates
const [users, setUsers] = useState([]);
// useEffect is a lifecycle method for function components, run once after mount
useEffect(() => {
// the callback to useEffect can't be async, but you can declare async within
async function fetchData() {
// use the await keyword to grab the resolved promise value
// remember: await can only be used within async functions!
const { data } = await axios.get(
`https://jsonplaceholder.typicode.com/users`
);
// update local state with the retrieved data
setUsers(data);
}
// fetchData will only run once after mount as the deps array is empty
fetchData();
}, []);
return (
<APIContext.Provider
// Add required values to the value prop within an object (my preference)
value={{
users
}}
>
{children}
</APIContext.Provider>
);
}
// Create a hook to use the APIContext, this is a Kent C. Dodds pattern
export function useAPI() {
const context = useContext(APIContext);
if (context === undefined) {
throw new Error("Context must be used within a Provider");
}
return context;
}
// 用户.jsx
import React from "react";
import { useAPI } from "./apiContext";
export default function Users() {
// Now we can grab the data we want via useAPI, which abstracts useContext()
const { users } = useAPI();
return (
<ul>
// Now we can use the data from the API in our components
// ofc this simple example can be adapted to make further calls
{users.map(u => (
<li key={u.id}>{u.username}</li>
))}
</ul>
);
}
可以在我整理的这个沙箱中找到上述代码的工作、实时版本:https://codesandbox.io/s/context-api-fetch-data-provider-example-0rymy