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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于获取数据的自定义反应钩子在第二次点击时未提供数据相关的知识,希望对你有一定的参考价值。

我有一个下面的自定义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网址,因此数据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);
        console.log("Error: " + error);
        return error;
    }
}, [isNew]); <--- This will ensure that everytime isNew, it will run the useEffect value again. 

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

以上是关于用于获取数据的自定义反应钩子在第二次点击时未提供数据的主要内容,如果未能解决你的问题,请参考以下文章

Jquery Click 事件在第二次点击时触发,但不是第一次

用于获取数据的自定义 React 钩子无法正常工作

使用自定义钩子封装 useEffect 和 AJAX 请求

系统互斥体的 AbandonedMutexException 在第一次运行被杀死时未在第二次运行中捕获

为啥 scanf (在 C 中)似乎只在第二次输入后才做出反应? [复制]

useState 在第二次点击时更新状态