首页 > web前端 > js教程 > 在 React 中使用 `useEffect` 从 API 获取数据的不同方法

在 React 中使用 `useEffect` 从 API 获取数据的不同方法

Linda Hamilton
发布: 2025-01-10 22:33:43
原创
788 人浏览过

Different Ways to Fetch Data from APIs Using `useEffect` in React

在 React 中,useEffect 钩子旨在运行副作用,例如在组件渲染时获取数据。虽然在这种特定情况下您无法避免调用 fetchData 函数(因为您需要一种方法来发起 API 请求),但您可以根据您的要求对其进行简化或抽象。

方法

1.内联获取逻辑

您可以将 fetchData 直接内联到 useEffect 挂钩内,而不是将 fetchData 定义为单独的函数。

useEffect(() => {
    const fetchData = async () => {
        setLoading(true);
        try {
            const response = await fetch('http://127.0.0.1:5000/indicators_signals');
            const data = await response.json();
            setData(data);
        } catch (error) {
            console.error('Error fetching data:', error);
        } finally {
            setLoading(false);
        }
    };

    fetchData();
}, []); // Empty dependency array ensures this runs only once
登录后复制

虽然这种方法消除了对 fetchData 的显式调用,但逻辑​​仍然作为内联异步函数存在。


2.自动调用API,无需显式函数

您可以在 useEffect 中直接将 fetch 操作作为 IIFE(立即调用函数表达式)执行。这消除了对像 fetchData 这样的命名函数的需要。

useEffect(() => {
    (async () => {
        setLoading(true);
        try {
            const response = await fetch('http://127.0.0.1:5000/indicators_signals');
            const data = await response.json();
            setData(data);
        } catch (error) {
            console.error('Error fetching data:', error);
        } finally {
            setLoading(false);
        }
    })(); // The function is invoked immediately
}, []);
登录后复制

这样,就可以直接执行获取逻辑,而无需显式调用命名函数。


3.使用自定义钩子

您可以将获取逻辑抽象为自定义钩子来封装功能并保持组件更清晰。

自定义挂钩:useFetch
import { useState, useEffect } from 'react';

const useFetch = (url) => {
    const [data, setData] = useState(null);
    const [loading, setLoading] = useState(true);
    const [error, setError] = useState(null);

    useEffect(() => {
        (async () => {
            try {
                const response = await fetch(url);
                const result = await response.json();
                setData(result);
            } catch (err) {
                setError(err);
            } finally {
                setLoading(false);
            }
        })();
    }, [url]);

    return { data, loading, error };
};

export default useFetch;
登录后复制
在组件中使用 Hook
import useFetch from './hooks/useFetch';

const MyComponent = () => {
    const { data, loading, error } = useFetch('http://127.0.0.1:5000/indicators_signals');

    if (loading) return <p>Loading...</p>;
    if (error) return <p>Error: {error.message}</p>;

    return (
        <div>
            <h1>Data from API:</h1>
            <pre class="brush:php;toolbar:false">{JSON.stringify(data, null, 2)}
); };
登录后复制

4.在更高级别的组件中预取数据

不要在需要的组件内部获取数据,而是在父级或更高级组件中获取数据并将其作为 props 传递。

const App = () => {
    const [data, setData] = useState(null);
    const [loading, setLoading] = useState(true);

    useEffect(() => {
        (async () => {
            try {
                const response = await fetch('http://127.0.0.1:5000/indicators_signals');
                const result = await response.json();
                setData(result);
            } finally {
                setLoading(false);
            }
        })();
    }, []);

    if (loading) return <p>Loading...</p>;

    return <ChildComponent data={data} />;
};

const ChildComponent = ({ data }) => (
    <div>
        <h1>Data:</h1>
        <pre class="brush:php;toolbar:false">{JSON.stringify(data, null, 2)}
);
登录后复制

要点

  • 如果不调用某些函数(显式或隐式)就无法获取数据,因为API调用是需要启动的异步操作。
  • 使用 IIFE、自定义钩子或更高级别的预取等技术可以简化结构并抽象取取逻辑。
  • 选择最适合您的应用程序结构和可读性目标的方法。对于可重用的获取逻辑,自定义挂钩是一个不错的选择!

以上是在 React 中使用 `useEffect` 从 API 获取数据的不同方法的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
上一篇:干净的代码:使用函数式编程管理副作用 下一篇:打印 HTML 最佳技术与样本收据。
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
相关专题
更多>
热门推荐
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板