我很难用最好的方式从 API 中获取数据一次(以及第一次请求时),然后存储结果以供重用和/或其他组件功能。下面是一个带有useContext
and的工作示例useReducer
,但对于这样一个“简单”的任务来说是相当复杂的。
有没有更好的方法?以及为大量 API 调用实现这一点的最佳方法是什么。任何建议都非常感谢。
import React from "react";
import ReactDOM from "react-dom";
import axios from 'axios';
const initialState = {
items: [],
itemsLoading: false
};
const actions = {
FETCHING_ITEMS: "FETCHING_ITEMS",
FETCHED_ITEMS: "FETCHED_ITEMS"
};
const reducer = (state, action) => {
switch (action.type) {
case actions.FETCHING_ITEMS:
return { ...state, itemsLoading: true, items: {} };
case actions.FETCHED_ITEMS:
return { ...state, items: action.value };
default:
return state;
}
};
const Context = React.createContext();
const Provider = ({ children }) => {
const [state, dispatch] = React.useReducer(reducer, initialState);
const value = {
items: state.items,
itemsLoading: state.itemsLoading,
fetchItems: () => {
if (!state.itemsLoading) {
dispatch({ type: actions.FETCHING_ITEMS });
axios
.get("https://jsonplaceholder.typicode.com/todos")
.then(function(response) {
dispatch({ type: actions.FETCHED_ITEMS, value: response.data });
});
}
}
};
return <Context.Provider value={value}>{children}</Context.Provider>;
};
const Filters = () => {
const { items, fetchItems } = React.useContext(Context);
React.useEffect(() => {
fetchItems();
}, [fetchItems]);
const listItems = items.length
? items.map(item => {
return <li key={item.id}>{item.title}</li>;
})
: "";
return (
<div>
<ul>{listItems}</ul>
</div>
);
};
const App = () => {
return (
<Provider>
<Filters />
</Provider>
);
};
const rootElement = document.getElementById("root");
ReactDOM.render(
<App />,
rootElement
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.19.2/axios.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>
无法让代码片段在 SO 上工作,这是一个工作沙箱:https : //codesandbox.io/s/falling-frog-4pdm1
谢谢!