fix(user): 优化用户页面余额积分等数据加载体验

- useRequest 改为 stale-while-revalidate 机制,缓存命中时立即展示数据并后台刷新
- 增加本地存储持久化,冷启动时先展示存储数据,避免骨架屏
- user 页面使用 mutate 结合本地缓存即时更新界面
- 网络请求失败时保留缓存数据,仅清除 loading 状态
- 优化加载逻辑,保障 30 秒缓存内数据可快速响应且自动刷新
This commit is contained in:
2026-07-04 15:34:46 +08:00
parent df5886a62d
commit b07a3525db
3 changed files with 65 additions and 9 deletions

View File

@@ -22,23 +22,37 @@ const UserPage: React.FC = () => {
const [userRoles, setUserRoles] = useState<UserRole[]>([])
// 获取用户卡片统计(余额/积分/优惠券/礼品卡)
// 使用 cacheKey 缓存 30s页面返回时先显示缓存数据再静默刷新
const { data: cardStats, run: runCardStats, loading: cardStatsLoading } = useRequest(getUserCardStats, {
// stale-while-revalidate: 缓存命中即时展示 + 后台静默刷新
// localStorage 持久化: 冷启动先读 storage 即时展示,避免骨架屏
const { data: cardStats, run: runCardStats, loading: cardStatsLoading, mutate: mutateCardStats } = useRequest(getUserCardStats, {
manual: true,
cacheKey: 'user_card_stats',
cacheTime: 30 * 1000,
onSuccess: (data) => {
// 请求成功后持久化到本地存储,下次冷启动可直接展示
Taro.setStorageSync('user_card_stats_v2', data)
},
})
// 获取用户订单统计(缓存 30s先缓存后静默刷新
const { data: orderStats, run: runOrderStats, loading: orderStatsLoading } = useRequest(getUserOrderStats, {
// 获取用户订单统计(同上 stale-while-revalidate + localStorage 持久化
const { data: orderStats, run: runOrderStats, loading: orderStatsLoading, mutate: mutateOrderStats } = useRequest(getUserOrderStats, {
manual: true,
cacheKey: 'user_order_stats',
cacheTime: 30 * 1000,
onSuccess: (data) => {
Taro.setStorageSync('user_order_stats_v2', data)
},
})
// 登录后加载数据
useEffect(() => {
if (isLoggedIn) {
// 冷启动优化:先从 localStorage 读取缓存即时展示,消除骨架屏
const cachedCardStats = Taro.getStorageSync('user_card_stats_v2')
if (cachedCardStats) mutateCardStats(cachedCardStats)
const cachedOrderStats = Taro.getStorageSync('user_order_stats_v2')
if (cachedOrderStats) mutateOrderStats(cachedOrderStats)
// 然后发起网络请求stale-while-revalidate 后台刷新)
runCardStats()
runOrderStats()
// 查询门店关联
@@ -58,7 +72,16 @@ const UserPage: React.FC = () => {
// 先从 storage 快速同步,立即更新 UI无网络延迟
const hasUser = syncFromStorage()
if (hasUser) {
// 使用缓存30s 内重复返回页面直接展示缓存数据,无需重新请求
// 冷启动优化:先从 localStorage 读取上次缓存数据即时展示,消除骨架屏
const cachedCardStats = Taro.getStorageSync('user_card_stats_v2')
if (cachedCardStats) {
mutateCardStats(cachedCardStats)
}
const cachedOrderStats = Taro.getStorageSync('user_order_stats_v2')
if (cachedOrderStats) {
mutateOrderStats(cachedOrderStats)
}
// 然后发起网络请求stale-while-revalidate 自动在后台刷新)
runCardStats()
runOrderStats()
// 刷新门店关联