到目前为止,答案很好,但是当您想要触发请求时,我会添加一个自定义挂钩,因为您也可以这样做。
function useTriggerableEndpoint(fn) {
const [res, setRes] = useState({ data: null, error: null, loading: null });
const [req, setReq] = useState();
useEffect(
async () => {
if (!req) return;
try {
setRes({ data: null, error: null, loading: true });
const { data } = await axios(req);
setRes({ data, error: null, loading: false });
} catch (error) {
setRes({ data: null, error, loading: false });
}
},
[req]
);
return [res, (...args) => setReq(fn(...args))];
}
如果您愿意,您可以使用此钩子为特定 API 方法创建一个函数,但请注意,此抽象不是严格要求的,并且可能非常危险(带有钩子的松散函数不是一个好主意,以防万一在 React 组件函数的上下文之外使用)。
const todosApi = "https://jsonplaceholder.typicode.com/todos";
function postTodoEndpoint() {
return useTriggerableEndpoint(data => ({
url: todosApi,
method: "POST",
data
}));
}
最后,从您的功能组件中
const [newTodo, postNewTodo] = postTodoEndpoint();
function createTodo(title, body, userId) {
postNewTodo({
title,
body,
userId
});
}
然后只需指向createTodo
一个onSubmit
或onClick
处理程序。newTodo
将有您的数据、加载和错误状态。沙盒代码就在这里。