首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有类型记录的自定义钩子

带有类型记录的自定义钩子
EN

Stack Overflow用户
提问于 2022-10-10 19:54:05
回答 1查看 42关注 0票数 0

我一直在学习自定义钩子,并希望在我的应用程序中重复的代码块上实现它们。重复块是一个try-catch块,用于从API中获取数据。

钩子:

代码语言:javascript
复制
const useFetch = (url: string, method: string) => {
    const [data, setData] = useState(null);
    const [errorMsg, setErrorMsg] = useState('');

    useEffect(() => {
        (async () => {
            try {
                const response = await api({ url, method });
                setData(response.data);
            } catch (error) {
                error instanceof Error && setErrorMsg(error.message);
            }
        })();
    }, [url, method]);

    return { data, errorMsg };
};

export default useFetch;

这是实现钩子之前来自组件的代码:

代码语言:javascript
复制
const Productivity = () => {
    const [productivity, setProductivity] = useState<IUser[]>([]);
    const [errorMsg, setErrorMsg] = useState<string>('');

    useEffect(() => {
        (async () => {
            try {
                const response = await api({ url: '/api/productivity', method: 'GET' });
                response.users && setProductivity(response.users);
            } catch (error) {
                error instanceof Error && setErrorMsg(error.message);
            }
        })();
    }, []);

    return <div>{productivity.length > 0 ? <ProductivityTable productivity={productivity} /> : <AlertMessage errorMsg={errorMsg} />}</div>;
};

同一组成部分的更新版本:

代码语言:javascript
复制
const Productivity = () => {
    const { data: productivity, errorMsg } = useFetch('/users', 'GET');
    

    return (
        <div>
            {errorMsg && <AlertMessage errorMsg={errorMsg} />}
            {productivity && <ProductivityTable productivity={productivity} />}
        </div>
    );
};

如果我运行这个应用程序,一切都运行的很顺利,但是我注意到{生产率}是“从不”的类型。那是什么意思?如何将生产力类型设置为IUser数组?我需要吗?我不知道这里的最佳做法是什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-10 20:00:52

使用返回数据类型的参数,将钩子更改为泛型函数:

代码语言:javascript
复制
function useFetch<T>(url: string, method: string) {
  const [data, setData] = useState<T | null>(null);
  // the rest stays the same
};

用法:

代码语言:javascript
复制
const { data: productivity, errorMsg } = useFetch<IUser[]>('/users', 'GET');
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74020085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档