React Native请求后UI不更新:进度条无法隐藏问题排查
React Native离线行为与错误处理异常问题
我在测试React Native应用的离线行为与错误处理,父组件通过条件渲染控制<TranslatingRecipesView>模态框的显示隐藏,模态框挂载时展示进度条,任务完成后自动关闭。
正常流程均符合预期,但模态框的catch语句else分支出现异常:
} catch (err) { setShowTranslationProgress(false); if (err.message === noInternet) { Alert.alert(noInternet, noInternetMessage); } else { Alert.alert(ErrorCodeOthers); } i18n.changeLanguage(prevGlobalLanguageCode); }
触发noInternet错误(抛出普通Error)时,进度条会随弹窗正常隐藏;但触发其他错误(原是Axios错误,即使替换为普通Error)时,进度条仍停留在弹窗后方无法隐藏。日志显示状态已正确更新。
我已尝试以下方案:
- 在catch块内调整
setShowTranslationProgress(false)的位置 - 将弹窗包裹在
setTimeout中 - 添加finally块并在其中调用
setShowTranslationProgress(false) - 在抛出Axios错误时将其包装为普通Error
- 不传递Axios错误,直接抛出普通Error
- 强制父组件与模态框重新渲染
- 缩短Axios请求超时时间
- 使用模态框的
visible属性替代父组件的条件渲染
错误触发位置如下,即使注释掉抛出Axios错误改为普通Error,问题仍存在:
static async getUnitOfMeasureTranslation( unitOfMeasureList: UnitOfMeasureModel[], targetLanguage: string ) { const unitOfMeasureData: any[] = []; unitOfMeasureList.map((unitOfMeasure) => { unitOfMeasureData.push({Text: unitOfMeasure.description}); }); const state = await NetInfo.fetch(); if (state.isConnected) { try { const response = await this.getTranslation( unitOfMeasureData, targetLanguage ); const translatedData = response.data; const updatedTranslatedData = unitOfMeasureList.map( (unitOfMeasure,index) => { return { ...unitOfMeasure, description: translatedData[index].translations[0].text, unique_id: unitOfMeasure.uom_id + '_' + targetLanguage, language: targetLanguage, }; } ); await createData(SchemaNames.UnitOfMeasureTranslationSchema,{ title: 'UnitOfMeasure', data: updatedTranslatedData, }); const mergedUnitOfMeasure = await this.mergeUnitOfMeasureTranslation(); return mergedUnitOfMeasure; } catch(e) { console.log(`ERROR TRANSLATING UNIT OF MEASURE TO ${targetLanguage}:`,e); // throw e throw new Error(translationNoInternetMessage); } } else { throw new Error(noInternet); } }
更新:在Axios请求前的try块内抛出错误,进度条可正常隐藏;但在请求后抛出错误则不行,推测问题与请求本身相关。
内容的提问来源于stack exchange,提问作者gabriellend
相关产品推荐
相关产品推荐

