【问题标题】:Use function as react hook?使用函数作为反应钩子?
【发布时间】:2020-02-19 22:52:19
【问题描述】:

我想使用一个函数作为一个反应钩子来将获取请求包装到一个 API。

我目前的钩子:

export function useAPI(url, options={}) {
    const [auth, setAuth] = useGlobal('auth');
    const [call, setCall] = useState(undefined);

    const apiFetch = async () => {
        const res = await fetch(url, {
            ...options,
        });
        if (!res.ok)
            throw await res.json();
        return await res.json();
    };

    function fetchFunction() {
        fetch(url, {
            ...options,
        });
    }

    useEffect(() => {
        // Only set function if undefined, to prevent setting unnecessarily
        if (call === undefined) {
            setCall(fetchFunction);
            //setCall(apiFetch);
        }

    }, [auth]);

    return call
}

这样,在反应函数中,我可以执行以下操作...

export default function LayoutDash(props) {
    const fetchData = useAPI('/api/groups/mine/'); // should return a function

    useEffect(() => {
        fetchData(); // call API on mount
    }, []);

    render(...stuff);
}

但似乎 react 不能在这样的钩子中使用函数。如果我将call 设置为fetchFunction,它将返回undefined。如果我将它设置为apiFetch,它会执行并返回一个promise,而不是我想在另一个组件中调用时可以调用的函数。

我最初选择了 react 钩子,因为我不能在 react 组件/钩子之外使用 useGlobal。而且我需要访问reactn 全局变量auth 来检查访问令牌是否已过期。

那么最好的方法是什么?最终目标是能够将(url, options) 传递给将成为获取请求的包装器的函数。 (它会检查auth.access 是否过期,如果是,则首先获取新的访问令牌,然后进行 api 调用,否则只进行 API 调用)。如果除了 react hooks 之外我还有其他方法可以解决这个问题,我想知道。

【问题讨论】:

  • 在这里吐口水,我只有大约 50%,我必须上班,所以我不会发布它作为答案:pastebin.com/k9wiFQ6s 可能有帮助,也可能没有帮助. :-)
  • 可以参考useDispatch钩子在react-redux
  • @JosephD。我不想使用 redux。使用 reactn 的目的是避免使用 redux。
  • @T.J.Crowder 那么是在一些随机的高级反应组件中,还是作为一个钩子?
  • @cclloyd 我只提到“推荐”不使用。 :) 也许上下文驱动的切换会有所帮助。

标签: javascript reactjs react-hooks reactn


【解决方案1】:

不要将您的函数放入useState,而是考虑使用useCallback。您的代码将如下所示:

export function useAPI(url, options={}) {
    const [auth, setAuth] = useGlobal('auth');

    function fetchFunction() {
        fetch(url, {
            ...options,
        });
    }

    const call = useCallback(fetchFunction, [auth]);


    const apiFetch = async () => {
        const res = await fetch(url, {
            ...options,
        });
        if (!res.ok)
            throw await res.json();
        return await res.json();
    };

    return call
}

每当auth 更改时,都会重新创建返回的函数,因此在某种程度上模仿了您尝试对useEffect 执行的操作

【讨论】:

  • 谢谢。我的解决方案最终是这样的。调用 useAPI() 返回一个回调,它本质上是一个包装好的 fetch 函数。
猜你喜欢
  • 1970-01-01
  • 2020-05-03
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多