首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在useEffect中包装使用钩子的函数?

如何在useEffect中包装使用钩子的函数?
EN

Stack Overflow用户
提问于 2022-01-13 02:59:15
回答 3查看 1.4K关注 0票数 1

我编写了一个函数来进行API调用。通常,我只需将其包装在一个useEffect中,并将其放入需要它的同一个文件中,但我正在尝试编写更简洁的代码。所以我做了下面的事。

在我的component.js文件中,我有以下内容:

代码语言:javascript
复制
import { apiCall } from '../../../framework/api.js';
import { useEffect, useState } from 'react';

export const Table = () => {
    const [ resp, setResp ] = useState();

    
    useEffect(() => {
        console.log(apiCall());
    }, []);
    
    return(
        <>
            { resp &&
                resp.map(([key, value]) => {
                    console.log("key: " + key);
                    return(
                        <SomeComponent />
                    );
                })
            }
        </>
    );
}

在我的api.js文件中,我有以下内容:

代码语言:javascript
复制
import axios from 'axios';
import { useState } from 'react';

export const apiCall = () => {
    const [ resp, setResp ] = useState();

    axios.get('https://some.domain/api/get').then((response) => {
        setResp(response.data);
    });

    if(resp) return resp;
}

这总是返回一个错误(无效的钩子调用)。钩子调用只能在函数组件的主体内调用。)

如果我重写了我的component.js,并将axios调用直接包含在useEffect中,而不是从外部文件调用函数apiCall(),那么它显然没有问题。

我想我知道这与我在apiCall函数中使用钩子和在useEffect中包装调用有关。但是,如果我不把它包装在useEffect中,它就会持续运行,我也不想这样做。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-01-13 03:08:36

您必须遵循自定义钩子命名约定才能工作。您可以在这里查看文档:https://reactjs.org/docs/hooks-custom.html

无论如何,我相信在这种情况下,这应该是可行的:

代码语言:javascript
复制
import axios from 'axios';
import { useState } from 'react';

export const useApiCall = () => {
    const [ resp, setResp ] = useState();

    axios.get('https://some.domain/api/get').then((response) => {
        setResp(response.data);
    });

    if(resp) return resp;
}

然后在component.js中,您可以调用useApiCall()

票数 2
EN

Stack Overflow用户

发布于 2022-01-13 03:26:31

通常,我们都是这样做的

代码语言:javascript
复制
export const useApiCall = () => {
    const [ resp, setResp ] = useState();

    useEffect(() => {
        axios.get('https://some.domain/api/get').then((response) => {
            setResp(response.data);
        });
    }, []);

    return resp;
}

然后像这样使用它

代码语言:javascript
复制
export const Table = () => {
    const resp = useApiCall();
    
    return(
        <>
            { resp &&
                resp.map(([key, value]) => {
                    console.log("key: " + key);
                    return(
                        <SomeComponent />
                    );
                })
            }
        </>
    );
}

函数名中的前缀"use“很重要,这就是我们如何定义自定义钩子的方法。

票数 1
EN

Stack Overflow用户

发布于 2022-01-13 03:18:12

React "useState“在函数"apiCall”中被调用,它既不是React函数组件,也不是自定义React 函数。React组件名称必须以大写的字母开头。React名称必须以单词"use"开头。

您可以使用以下方法。

代码语言:javascript
复制
import { useState } from 'react';

export const ApiCall = () => {
  const [state, setState] = useState();
};

代码语言:javascript
复制
import { useState } from 'react';

export const useApiCall = () => {
  const [state, setState] = useState();
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70690911

复制
相关文章

相似问题

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