【发布时间】:2019-12-30 06:02:27
【问题描述】:
我正在构建我的第一个自定义 React Hook,但我对我认为代码的一个简单方面感到困惑:
export const useFetch = (url, options) => {
const [data, setData] = useState();
const [loading, setLoading] = useState(true);
const { app } = useContext(AppContext);
console.log('** Inside useFetch: options = ', options);
useEffect(() => {
console.log('**** Inside useEffect: options = ', options);
const fetchData = async function() {
try {
setLoading(true);
const response = await axios.get(url, options);
if (response.status === 200) {
setData(response.data);
}
} catch (error) {
throw error;
} finally {
setLoading(false);
}
};
fetchData();
}, []);
return { loading, data };
};
我将两个参数传递给 useFetch:一个 url 和一个 headers 对象,其中包含如下所示的 AWS Cognito 授权密钥:Authorization: eyJraWQiOiJVNW...(为简洁起见)
当我这样做时,options 上的对象确实存在于 useFetch 附近,但在 useEffect 构造中它是空的。然而,url 字符串在两种情况下都正确填充。
这对我来说毫无意义。可能有人知道为什么会这样吗?
【问题讨论】:
-
我相信这是一个异步计时问题。我在
useEffect中添加了options作为依赖项,现在它似乎可以工作了。也就是说,现在有 2 次调用 API 端点,第一次调用返回401错误。我想我可以在异步函数调用周围放置一个if ... then构造,尽管这本质上看起来是错误的。 -
我的代码底部现在看起来像这样:``` if (options) { fetchData(); }; }, [选项]); ``` 但是,该函数被父组件调用了两次。我还不知道这是因为我一直在讨论的代码中的缺陷还是父组件中的某些问题。
-
正如我在下面的回答中所解释的,我很确定问题来自使用此挂钩的组件,而不是挂钩本身。您能否提供更多代码来展示您如何使用它?
标签: javascript react-hooks use-effect