【发布时间】:2021-10-19 20:27:26
【问题描述】:
简介
我有一个屏幕向我的服务器发出一些查询:
-
按用户名获取用户(当用户在搜索输入中输入内容时)
-
获取高级用户(当屏幕安装 + 拉动刷新时)
-
获取年轻用户(当屏幕安装 + 拉动刷新时)
我正在考虑把它移到一个钩子上。
这是我当前的代码:
function MyScreen() {
// Fetch by username
const [isSearching, setIsSearching] = useState([]);
const [searchedUsers, setSearchedUsers] = useState([]);
// Premium
const [isLoading, setIsLoading] = useState(true); <--- NOTE THIS
const [premiumUsers, setPremiumUsers] = useState([]);
// Young users
const [youngUsers, setYoungUsers] = useState([]);
/*
FIRST METHOD
*/
const searchUsersByUsername = async (limit = 20) => {
setIsSearching(true);
try {
const result = await api.users.searchUsersByUsername(username, limit);
setSearchedUsers(result);
} catch(err) {
console.log(err);
}
setIsSearching(false);
}
/*
SECOND METHOD
*/
const getPremiumUsers = async (limit = 10) => {
// Note: No loading here
try {
const result = await api.users.getPremiumUsers(limit);
setPremiumUsers(result);
} catch(err) {
console.log(err);
}
}
/*
THIRD METHOD
*/
const getYoungUsers = async (limit = 10) => {
// Note: No loading here
try {
const result = await api.users.getYoungUsers(limit);
setYoungUsersUsers(result);
} catch(err) {
console.log(err);
}
}
// Effects and rendering...
useEffect(() => {
(async () => {
const promises = [getPremiumUsers(), getYoungUsers()];
await Promise.all(promises).catch((err) => {
console.log(err))
});
setIsLoading(false); // <---- NOTE THIS
})();
}, []);
}
问题
我无法使用典型的 useQuery 挂钩,因为我使用的是 Firestore 可调用函数。因此,发出请求的唯一方法是调用我的 api 方法 (api.users.searchUser...)
正如你在代码中看到的,我有两种类型的加载指示器(两种状态):
-
isSearching(用于按用户名搜索功能)
-
isLoading(用于并行获取高级用户和年轻用户)
我怎样才能为这个逻辑实现一个可重用的钩子?
我的意思是,我需要抽象所有这些东西,以便能够:
-
在其他屏幕中按用户名搜索用户
-
搜索高级用户(不同时获取年轻用户)
-
搜索年轻用户(不并行获取高级用户)
还有,获取三个查询的加载状态。
注意:在我当前的屏幕中,正如我之前所说,我正在为年轻和高级用户并行获取“setIsLoading”,但可能(更灵活)在其他屏幕中我将需要每个逻辑独立的加载状态。
有什么帮助或想法吗?
【问题讨论】:
-
“我不能使用典型的 useQuery 挂钩,因为我使用的是 Firestore 可调用函数”,不确定我是否理解此语句?
-
@AaronSaunders 我的意思是,我无法提供端点 url 或使用 axios。相反,我必须使用提供方法(如“functions.httpsCallable(function_name)({ ...params })”)的 Firebase SDK 来连接到我们的后端。
标签: javascript reactjs react-native react-hooks refactoring