繁体   English   中英

用于获取数据的自定义反应钩子不会在第二次点击时提供数据

[英]Custom react hook to fetch data is not giving data on second hit

我有一个下面的自定义useEffect钩子来从 API 获取数据。

export const useGetData = (url, body, isNew) => {
const [state, setState] = useState([]);
const [error, setError] = useState({});

useEffect(() => {
    if (isNew) {
        fetch(url, {
            method: 'Post',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(body)
        }).then(response => response.json())
            .then(apiData => {
                   setState({ apiData });
            }).catch(error =>
                console.error('Error:', error)
            );
        setError(error);
        console.log("Error: " + error);
        return error;
    }
}, []);
return state;
}

现在,在我的组件中,我试图在handleInputChanges事件之后使用上面的钩子,如下所示

let dt = {};
const [inputParam, setInputParam] = useState({
    FirstName: 'Tom',
    LastName : 'Harris'
});

const handleInputChanges = (params) =>{
    setInputParam(params);
};

dt = useGetData (url, inputParam, true);

使用上面的代码,我可以点击useGetData自定义钩子,但是钩子没有调用 API url,因此数据dt没有更新。 怎么了? 请建议。

您没有在 useEffect 中正确传递第二个参数。

弄成这样

useEffect(() => {
    if (isNew) {
        fetch(url, {
            method: 'Post',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(body)
        }).then(response => response.json())
            .then(apiData => {
                   setState({ apiData });
            }).catch(error =>
                console.error('Error:', error)
                setError(error); // Save your error inside the catch block
            );

        // return error; <-- Do not return anything that isn't used for useEffect cleanup! Use return only for cleanup, like unsubscribing API. 
    }
}, [isNew]); <--- This will ensure that everytime isNew changes, it will run the useEffect again. 

但是您可能想将依赖项更改为其他变量,因为 isNew 是一个布尔值,因此我认为如果在下一次调用时您再次传递 true ,它可能不起作用。

您可以使用 URL 作为 useEffect 的依赖项,这样在每个新 URL 上,它都会在 useEffect 中运行调用。

您在 useEffect 的第二个参数中使用空数组,当道具更改时这不会更新。 这类似于 componentDidMount。 您需要传递像 [url, body, isNew] 这样的道具,或者根本不要在 useEffect 中传递第二个参数。

export const useGetData = (url, body, isNew) => {
const [state, setState] = useState([]);
const [error, setError] = useState({});

useEffect(() => {
    if (isNew) {
        fetch(url, {
            method: 'Post',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(body)
        }).then(response => response.json())
            .then(apiData => {
                   setState({ apiData });
            }).catch(error =>
                console.error('Error:', error)
            );
        setError(error);
        console.log("Error: " + error);
        return error;
    }
}, [url, body, isNew]);
return state;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM