【发布时间】:2021-12-07 04:14:41
【问题描述】:
我有一个 api,它为我提供如下方法:
- searchUsersByUsername(用户名,限制)
- getRandomPremiumUsers(limit)
- 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”方法的字段“用户名”。
关于如何满足类似抽象的需求的任何想法?
【问题讨论】:
-
你想在这里达到什么目的:
useEffect(getUsers, deps);? -
你的问题太宽泛了,试试看能否在你的项目中使用 react-query。此外,有多种方法可以实现它。只需创建方法来获取数据并返回它。所以你可以通过任何方式打电话。
-
@SinanYaman 在必要时获取组件挂载
-
@ChandraKumar 我不能使用 react-query。
-
我也想过为每个方法创建独立的钩子,但在某种程度上,由于它们是相关的概念,我认为将所有东西抽象在一个钩子中是一个更好的主意。
标签: javascript reactjs react-native design-patterns react-hooks