reactjs - 对在两个单独的函数中使用“useState”感到困惑
问题描述
为了从我的 AWS Postgres DB 中获取数据,我必须首先获取一个 AWS 访问令牌并将其传递给 GET 调用。为此,在我的 React 应用程序中,我创建了一个名为的文件requests.js
,我计划在其中构建许多函数。这是前两个:
// Custom hook to get AWS Auth Token
export const useGetAwsAuthToken = () => {
const [data, setData] = useState();
useEffect(() => {
const fetchData = async function() {
try {
const config = {
headers: { "Authorization":
await Auth.currentSession()
.then(data => {
return data.getAccessToken().getJwtToken();
})
.catch(error => {
})
}
};
setData(config);
} catch (error) {
throw error;
} finally {
}
};
fetchData();
}, []);
return { data };
};
// Custom hook for performing GET requests
export const useFetch = (url, initialValue) => {
const [data, setData] = useState(initialValue);
const [loading, setLoading] = useState(true);
useEffect(() => {
const fetchData = async function() {
try {
setLoading(true);
const response = await axios.get(url);
if (response.status === 200) {
setData(response.data);
}
} catch (error) {
throw error;
} finally {
setLoading(false);
}
};
fetchData();
}, [url]);
return { loading, data };
};
我的印象是我可以const [data, setData] = useState();
在这两个功能中使用它们并且它们将彼此独立。然而,回到我调用函数的地方,我的 IDE 告诉我第二次调用“数据已经被声明”:
const {data} = useGetAwsAuthToken();
const {loading, data} = useFetch('https://jsonplaceholder.typicode.com/posts');
此外,假设我注释掉上面的第二行代码并进行此调用:
const {data2} = useGetAwsAuthToken();
这data2
未定义。这也令人困惑,因为我不应该能够在调用函数中有任何命名的返回值变量吗?
解决方案
首先,对我来说更容易回答的一个:const {data2} = useGetAwsAuthToken
无效,因为您正在使用解构并且它期望数据的价值。所以你所说的相当于说const data2 = useGetAwsAuthToken().data2
你真正想要的是const { data: data2 } = useGetAwsAuthToken()
。这将采用返回的值 ( data
) 并将其保存到当前作用域中data2
。
现在是你提出的第一个问题。为什么你在看起来只是一个函数的地方使用反应生命周期?当它只是一个不返回 React 组件的函数时,您不需要将内容保存在 state 中。
推荐阅读
- python - 与 Mapbox 交互的 Dash 数据表
- questdb - 如何使用 Python 将数据从 CSV 复制到 QuestDB?
- search - Notepad++:复杂的查找和替换
- java - 仅在特定列中移动行
- python - Odoo:one2many 和 many2one?键错误:'___'
- angular - Angular v8 到 v11 - 禁用常春藤的 entryComponents 问题
- android-studio - Android Studio:ping URL 时出错:http://google.com。不允许到 google.com 的明文 HTTP 流量
- wordpress - Google 上的网站索引问题(Wordpress + Yoast 插件)
- windows - Unity 中的 TCP 连接
- r - 如何为 CLVTools::clvdata() 准备数据