使用 React Hooks 编写 REST API 时如何重用代码?

Posted

技术标签:

【中文标题】使用 React Hooks 编写 REST API 时如何重用代码?【英文标题】:How can I reuse code when writting REST API with React Hooks? 【发布时间】:2020-11-10 13:30:36 【问题描述】:

我正在阅读一个 REST API 教程并做出反应,但我想提前一步编写干净的代码。因此,我想向您寻求帮助,以便我可以针对不同的 API 请求重用钩子。

在本教程中,我编写了这个示例,其中 Hooks 用于保存 API 请求状态,并认为这是一个我可以重复使用的好模式。基本上除了const data = await API.getItems(token['my-token']) 之外的所有东西都可以用于我想要发出的所有/大多数API 请求。在构建干净的 API 框架时,我应该如何使用这些技术重用代码?

import  useState, useEffect  from 'react';
import  API  from '../api-service';
import  useCookies  from 'react-cookie';

function useFetch() 
    const [data, setData] = useState([]);
    const [loading, setLoading] = useState(true);
    const [error, setError] = useState();
    const [token] = useCookies(['my-token']);

    useEffect( ()=> 
        async function fetchData() 
            setLoading(true);
            setError();
            const data = await API.getItems(token['my-token'])
                .catch( err => setError(err))
            setData(data)
            setLoading(false)
        

        fetchData();
    , []);
    return [data, loading, error]


export  useFetch 

非常感谢!

【问题讨论】:

【参考方案1】:

看起来您已经有了一个自定义挂钩。你可以在任何你想要的组件中使用它。

基本上除了 const data = await API.getItems(token['my-token']) 可用于所有/大多数 API 请求 我想做。

您可以向自定义挂钩发送一些参数,并根据这些参数动态发送请求。

function useFetch(someArgument) 
  const [data, setData] = useState([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState();
  const [token] = useCookies(["my-token"]);

  useEffect(() => 
    async function fetchData() 
      setLoading(true);
      setError();
      if (someArgument === 'something') 
        const data = await API.getItems(token["my-token"]).catch((err) =>
          setError(err)
        );
       else 
        // do something else
      
      setData(data);
      setLoading(false);
    

    fetchData();
  , []);
  return [data, loading, error];

在组件中使用自定义钩子:

import React from "react";

export default ( name ) => 
  const [data, loading, error] = useFetch('something');
  
  return <h1>Hello name!</h1>;
;

【讨论】:

【参考方案2】:

我认为你做得很好,但你可以通过参数化它来改进代码,也许是这样的(如果你总是以相同的方式使用 cookie 和令牌):

import  useState, useEffect  from 'react';
import  API  from '../api-service';
import  useCookies  from 'react-cookie';

function useFetch(cookieName, promiseFactory) 
    const [data, setData] = useState([]);
    const [loading, setLoading] = useState(true);
    const [error, setError] = useState();
    const [token] = useCookies([cookieName]);

    useEffect( ()=> 
        async function fetchData() 
            setLoading(true);
            setError();
            const data = await promiseFactory(token[cookieName])
                .catch( err => setError(err))
            setData(data)
            setLoading(false)
        

        fetchData();
    , []);
    return [data, loading, error]


export  useFetch 

您可以添加cookieName 或cookie 名称数组以及promise,这显然可能有所不同。 promiseFactory 将接受令牌并执行其特定的工作(token) =&gt; Promise,以便将令牌检索逻辑封装在挂钩中,即token[cookieName] 部分。

用法如下:

function SomeComponent 
        const promiseFactory = (token) => API.getItems(token);
    
        const [data, loading, error] = useFetch('my-token', promiseFactory );
    

如果 cookie 逻辑和令牌检索也特定于仅针对您提供的情况,您可以将其移出挂钩,例如:

function SomeComponent 
    const [token] = useCookies(['my-token']);

    const promise = API.getItems(token['my-token']);

    const [data, loading, error] = useFetch(promise);

第二种方法将完全抽象出有关如何构造请求的细节。

【讨论】:

以上是关于使用 React Hooks 编写 REST API 时如何重用代码?的主要内容,如果未能解决你的问题,请参考以下文章

React Hooks/上下文和弹性 UI。函数组件中获取数据 (REST) 的问题

呕心沥血编写的React Hooks最佳实践

react---Hooks的基本使用---巷子

React 16.8发布:hooks终于来了!

React - Redux Hooks的使用细节详解

React Hooks 实现原理