javascript - 等待状态在 React native 中设置后如何打开模式?
问题描述
我有一个屏幕上有一些选择。如果您选择该选项,它会设置数据的状态。然后我有一个确认按钮。如果用户点击确认,我会进行异步调用以获取一些额外的数据。我想在打开模态之前等待这种情况发生,因为我需要在我的模态中显示额外的数据。
在挂钩之前,我会使用 setState 并执行以下操作:
this.setState({data: myData}, () => this.openModal())
因为这将可靠地设置状态然后打开模式。网上所有的答案似乎都建议使用useEffect
,但这样做似乎很狡猾:
useEffect(() => {
if (data) {
setModalOpen(true)
}
}, [data, setData])
我不希望我的模态可能在不同点随机打开。另外,将代码放在我设置状态的同一个地方似乎更好。在那里很有意义。不是随机的useEffect
有什么建议可以实现吗?
(我能想到的另一种解决方案是在每个选择上进行 API 调用,而不是在确认之前)但是,这可能会导致很多不必要的 API 调用,所以我宁愿不走那条路。
解决方案
使用useEffect()
是正确的,我在尝试使用钩子对 setState 进行回调时也遇到了这个问题。
就像你说的:this.setState({data: myData}, () => this.openModal())
以前是可能的,但是现在当用钩子尝试这个时,控制台会显示错误:
警告:来自 useState() 和 useReducer() Hooks 的状态更新不支持第二个回调参数。要在渲染后执行副作用,请在组件主体中使用 useEffect() 声明它。
所以useEffect()
似乎要走的路。
useEffect()
如果您想对状态执行某些操作,例如验证,则应在正确设置状态后将其用作回调。
useEffect(() => {
// fetch on load
axios.get("https://randomuser.me/api/").then((response) => {
setPerson(response.data.results[0]);
});
}, []);
useEffect(() => {
// do some validation perhaps
if (person !== null) {
if (person.name.first && person.name.last) {
setModal(true);
} else {
setModal(false);
}
}
}, [person]); // add person in dependency list
正如评论中所建议的,您也可以setModal()
在异步数据到达时执行(使用.then() or await
)。
一些使用随机用户生成器 API和axios进行获取的示例代码。
useEffect(() => {
// fetch on load
axios.get("https://randomuser.me/api/").then((response) => {
setPerson(response.data.results[0]);
setModal(true); // set modal visibility
});
}, []);
推荐阅读
- c# - 使用日期和月份计算 CalenderWeek
- node.js - 新的 package.json `exports` 字段不适用于 TypeScript
- google-apps-script - 如果单元格“y”大于单元格“x”,则自动将单元格“y”复制到单元格“x”
- python - Dash(Python) - 计算后无法在数据表中显示数据框
- ios - Swift如何暂停音频
- javascript - Anychart标签云规模
- c# - 无法从 while 函数返回字符串
- javascript - firebase - Reference.set 失败:第一个参数在属性“users.undefined.profileImageUrl”中包含未定义
- python - 在networkx python中,如何将一组新的节点和边连接到图中的每个节点?
- python - 如何根据以逗号分隔的唯一列值将熊猫数据框列中的文本转换为一个热编码列