有没有办法在反应功能组件中只进行一次 api 调用?

Posted

技术标签:

【中文标题】有没有办法在反应功能组件中只进行一次 api 调用?【英文标题】:Is there a way to do an api call only once in react functional component? 【发布时间】:2020-07-06 22:04:37 【问题描述】:

对不起,如果这是一个初学者问题>

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

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

组件看起来是这样的(如果有类型,我简化了一点很抱歉):

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 调用。

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

【问题讨论】:

【参考方案1】:

useEffect(yourCallback, []) - 只有在 第一次渲染。

阅读文档hooks-effect

这与How to call loading function with React useEffect only once有关

【讨论】:

【参考方案2】:

使用useEffect

如果你想运行一个效果并且只清理一次(在挂载和卸载时),你可以传递一个空数组([])作为第二个参数。这告诉 React 你的效果不依赖于任何来自 props 或 state 的值,所以它永远不需要重新运行。这不是作为特殊情况处理的——它直接遵循依赖项数组的工作方式。

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>
        </>
    )

【讨论】:

以上是关于有没有办法在反应功能组件中只进行一次 api 调用?的主要内容,如果未能解决你的问题,请参考以下文章

在 React.js 的功能组件中首次渲染之前调用 api

有没有办法在 useEffect 的反应组件中设置 xstate 机器的状态?

API 调用在循环中只返回一次响应

多次在 API 调用上以反应原生方式呈现屏幕

使用 get API 调用反应全局状态/道具(没有 Redux)

在反应组件中未调用拖动端的 Firefox