创建计划页愿望加载异常处理

## 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 新增 wishEmptyContainerwishEmptyButtonwishErrorContainer 样式

所有网络/服务调用失败时,都应该给用户可见的错误提示,而不是静默失败。错误不打断用户操作,用户仍可继续下一步(手动选择愿望)。

← 所有文章