我有一個 api,它為我提供了如下方法:
- searchUsersByUsername(用戶名,限制)
- getRandomPremiumUsers(限制)
- getYoungUsers(maxAge, limit)
我正在實作一個鉤子“useFetchUsers”,它將提供一個介面來訪問這些方法。
這是我當前的代碼:
import { useState, useEffect } from "react";
import {
searchUsersByUsername,
getRandomPremiumUsers,
getRandomYoungUsers,
} from "../../services/firebase/api/users/search"
import { MAX_SEARCH_USERS_BY_USERNAME_TO_RETRIEVE } from "../../utils/search";
export const QUERIES = {
"SEARCH_USERS_BY_USERNAME": searchUsersByUsername,
"FETCH_RANDOM_PREMIUM_USERS": getRandomPremiumUsers,
"FETCH_RANDOM_YOUNG_USERS": getRandomYoungUsers,
};
const defaultOptions = {
query: QUERIES[0],
username: "", // optional
limit = MAX_SEARCH_USERS_BY_USERNAME_TO_RETRIEVE, // optional
};
export default function useFetchUsers(options = defaultOptions, deps) {
const [users, setUsers] = useState([]);
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState(undefined);
const getUsers = async () => {
setIsLoading(true);
try {
const users = await options.query();
setUsers(users);
} catch(err) {
setError(err);
}
setIsLoading(false);
}
useEffect(getUsers, deps);
return {
users,
isLoading,
error,
getUsers
}
}
我面臨的主要問題是,我不知道如何使這個“介面”更加靈活,以便能夠將引數傳遞給我的 QUERY 方法。
此外,我的 defaultOptions 物件不需要“getRandomPremiumUsers”和“getRandomYoungUsers”方法的“用戶名”欄位。
關于如何滿足類似抽象后的要求的任何想法?
uj5u.com熱心網友回復:
創建方法并回傳
export default function useFetchUsers() {
const initialState = {
payload: null,
error: null,
inFlight: false,
};
const [result, setResult] = useState(initialState);
const searchUsersByUsername = () => {
setResult({ payload: null, error: null, inFlight: true });
try {
const payload = fetch("api");
setResult({ payload, error: null, inFlight: false });
} catch (error) {
setResult({ payload: null, error: null, inFlight: false });
}
};
return {
...result,
searchUsersByUsername,
};
}
撰寫一個實作獲取邏輯的 API 助手
const api = {
user: {
searchUsersByUsername: (option) => {
return fetch(option);
},
getRandomPremiumUsers: (option) => {
return fetch(option);
},
getYoungUsers: (option) => {
return fetch(option);
},
},
};
export default function useFetchUsers() {
const initialState = {
payload: null,
error: null,
inFlight: false,
};
const [result, setResult] = useState(initialState);
const updateState = (fetcher, option) => {
setResult({ payload: null, error: null, inFlight: true });
try {
const payload = fetcher(option);
setResult({ payload, error: null, inFlight: false });
} catch (error) {
setResult({ payload: null, error: null, inFlight: false });
}
};
return {
...result,
updateState,
};
}
function App() {
const { updateState, payload } = useFetchUsers();
return (
<div
onclick={() =>
updateState(api.user.searchUsersByUsername, { username: 'name', limit: 10 })
}
>
searchUsersByUsername
</div>
);
}
因此,根據您的用例,您可以在 API 層本身中實作快取或使用背景關系 API 擴展它
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/327712.html
標籤:javascript 反应 反应原生 设计模式 反应钩子
