创建计划页愿望加载异常处理
## 1. 问题背景
by 于尘
·
知与行
CloudBase
1. 问题背景
用户在使用「创建计划」页面时,遇到「Fetch Error: undefined」错误,但没有任何具体的错误提示或恢复指引。
现状问题:
| 场景 | 原有处理 | 问题 |
|---|---|---|
| 用户没有愿望 | 只显示 placeholder | 无引导 |
| 加载愿望失败 | 只 console.error | 用户不知道失败 |
| 云函数调用失败 | 只 console.error | 用户不知道失败 |
2. 问题列表
2.1 问题一:加载愿望失败时用户无感知
根因:
loadWishData 函数在 catch 块中只打印错误日志,没有任何 UI 反馈。
// 修复前
} catch (err) {
console.error('加载愿望关联数据失败:', err)
}
用户看到的:wishOptions 保持空数组,选择器显示"请选择关联愿望",但用户不知道是因为网络问题还是真的没有愿望。
方案:
- 短期方案:添加
wishLoadState状态,展示加载状态 - 长远方案:无,这是基础体验问题
采纳方案:短期方案(添加状态 + 错误提示)
2.2 问题二:云函数调用失败时用户无感知
根因:
autoMatchWish 函数在 catch 块中只打印错误日志,不设置任何 UI 错误提示。
// 修复前
} catch (err) {
console.error('自动关联愿望失败:', err)
}
用户看到的是:spinner 消失,但不知道发生了什么。
方案:
- 短期方案:在
catch中设置setError()展示错误提示 - 长远方案:无,这是基础体验问题
采纳方案:短期方案(设置错误提示 + 自动消失)
2.3 问题三:没有愿望时无引导
根因:
当用户没有愿望时,选择器直接禁用,没有任何引导用户去创建愿望的入口。
// 修复前
disabled={wishOptions.length === 0}
{wishOptions.length === 0 && (
<Text style={styles.wishHelperText}>{t('newPlan.relatedWishEmpty')}</Text>
)}
用户需要自己理解"没有愿望"并主动去愿景页面创建。
方案:
- 短期方案:显示「前往愿景」按钮
- 长远方案:无,这是基础体验问题
采纳方案:短期方案(显示按钮引导创建愿望)
3. 修复方案
3.1 新增状态
const [wishLoadState, setWishLoadState] = useState<'idle' | 'loading' | 'success' | 'empty' | 'error'>('idle')
3.2 错误提示话术
| 场景 | 提示文案 |
|---|---|
| 加载愿望失败 | "加载愿望失败了,请手动选择愿望~" |
| 云函数网络失败 | "自动匹配网络开小差了,请手动选择愿望~" |
| 云函数内部报错 | "匹配服务临时休息了,请手动选择愿望~" |
| 未知错误 | "好像哪里不对劲,请手动选择愿望~" |
3.3 UI 状态
- loading:显示 spinner + "加载愿望中..."
- empty:黄色提示条 + "还没有愿望,先去创建愿望吧" + [前往愿景] 按钮
- error:红色提示条 + 对应错误文案
- success:正常选择器
3.4 错误清除时机
- 用户手动选择愿望时 → 清除
- 用户开始输入新标题时 → 清除
4. 小结
| 修改文件 | 修改内容 |
|---|---|
new-plan.tsx |
新增 wishLoadState 状态 |
new-plan.tsx |
loadWishData 增加状态设置 |
new-plan.tsx |
autoMatchWish 增加错误提示 |
new-plan.tsx |
handleTitleChange / handleSelectWish 增加错误清除 |
new-plan.tsx |
UI 增加 loading / empty / error 状态展示 |
new-plan.tsx |
新增 wishEmptyContainer、wishEmptyButton、wishErrorContainer 样式 |
所有网络/服务调用失败时,都应该给用户可见的错误提示,而不是静默失败。错误不打断用户操作,用户仍可继续下一步(手动选择愿望)。