当前位置: 首页 > 知识库问答 >
问题:

有没有办法在react功能组件中只调用一次api?

厍浩广
2023-03-14

抱歉,如果这是一个初学者问题

我正在尝试使用功能组件,因为我一直在做类组件。

我有一个简单的组件,它应该从服务器加载一个列表,并显示它。

组件如下所示(如果有类型,我有点抱歉):

const ItemRelationsList = (props: ItemRelationsListProps): JSX.Element => {
    const [getList, setList] = useState([]);

    const loadRelation = (): void => {
        HttpService.GetAsync<getListRequest, getListResponse>('getList',{
            // params
        }).subscribe(res => {
            setList(res.data.list);
        });
    }
    loadRelation();


  return (
    <>
        <Table
            columns={columns}
            dataSource={getList}
        >
        </Table>
    </>
  )
}

我面临的问题是,每次使用setList时,组件都会被重新绘制,因此http调用会被重新执行

除了使用类组件之外,还有其他方法可以防止这种情况吗?

共有2个答案

董弘新
2023-03-14

USEPERP(你的Callback, []) - 只会在第一次渲染后触发回调。

阅读文档挂钩效果

这与如何只调用一次带有React-useEffect的加载函数有关

卫鸿朗
2023-03-14

使用效果

如果希望运行一个效果并只清理一次(装载和卸载时),可以将空数组([])作为第二个参数传递。这告诉React,您的效果不依赖于道具或状态的任何值,因此它永远不需要重新运行。这并不是作为特例处理的——它直接遵循依赖项数组的工作方式。

const ItemRelationsList = (props: ItemRelationsListProps): JSX.Element => {
    const [getList, setList] = useState([]);

    // componentDidMount
    useEffect(() => {
        loadRelation()
    }, [])

    const loadRelation = (): void => {
        HttpService.GetAsync<getListRequest, getListResponse>('getList',{
            // params
        }).subscribe(res => {
            setList(res.data.list);
        });
    }

    return (
        <>
            <Table
                columns={columns}
                dataSource={getList}
            >
            </Table>
        </>
    )
}
 类似资料:
  • 问题内容: 例如我可以做: React将在哪里渲染: 目前,我遇到了错误: 在使用browserify和babelify进行转译时 问题答案: 从React v16.0版本开始,当您位于组件内部时,您可以呈现一个组件数组,而无需在额外的元素中包装项目: 切记仅设置按键。 更新 现在从16.2版本开始,您可以使用片段 短语法 在,您仍然无法渲染多个项目,因为react需要一个根。因此,您可以在中渲染

  • 问题内容: 使用方法是否有获取功能的方法?使用实际表单元格时可以使用该方法吗? 特别是我需要一些“单元格”来跨越多列。 真实表是不可能的,因为我在 每行 布局中使用 表单 ,因此无法作为真实表进行验证。 问题答案: 不,您不能将colspan或rowpan添加到display:table-cell。这是表格单元功能的限制之一! 您可以在此参考链接中查看限制 如果要将COLSPAN功能引入表单元,则

  • 请就如何实现这一点提出一个方法? ========================================================================================================= jaspyt提供了3种不同的密码解密方法。我尝试了前两种方法,并且能够成功地加密/解密,但问题是密钥必须作为环境或系统属性传递。 第三种方法是使用自定义J

  • 问题内容: 我想在Python中使用PhantomJS。我用谷歌搜索了这个问题,但是找不到合适的解决方案。 我发现 可能是一个不错的选择。但是我无法通过一些争论。 使用可能是目前合适的解决方案。我想知道是否有更好的解决方案。 有没有办法在Python中使用PhantomJS? 问题答案: 在python中使用PhantomJS的最简单方法是通过Selenium。最简单的安装方法是 安装NodeJS

  • 我想在Python中使用PhantomJS。我谷歌了这个问题,但找不到合适的解决方案。 我发现可能是一个不错的选择。但我无法向它传递一些论据。 使用目前可能是一个合适的解决方案。我想知道是否有更好的解决办法。 有没有办法在Python中使用PhantomJS?

  • 问题内容: 我有 而不是一个一个地执行每个功能,如下所示: 是否有内置的方法可以按类中的顺序遍历并执行每个函数? 问题答案: 不能。您可以访问,并依次调用每个值(对于不可调用的成员会捕获错误),但是顺序不会保留。 像您的示例一样,假设所有函数都没有参数。