- 添加银行卡管理页面和相关API - 实现银行卡列表展示、添加、编辑和删除功能 - 优化提现页面,支持选择银行卡进行提现 - 新增 FixedButton 组件用于底部固定按钮
166 lines
5.4 KiB
Markdown
166 lines
5.4 KiB
Markdown
# 头像昵称显示问题修复说明
|
||
|
||
## 问题描述
|
||
用户更新头像和昵称后,头部显示变成了"已登录"而不是显示用户的头像和昵称。
|
||
|
||
## 问题分析
|
||
|
||
### 根本原因
|
||
在 Header 组件中,显示逻辑存在以下问题:
|
||
|
||
1. **显示逻辑不完整**:头像和昵称的显示只依赖 `user` 状态,没有考虑本地存储的备用数据
|
||
2. **状态同步延迟**:`useUser` hook 中的状态更新可能存在延迟,导致界面显示不及时
|
||
3. **缺少状态监听**:Header 组件没有充分监听用户信息的变化
|
||
|
||
### 具体问题代码
|
||
```typescript
|
||
// 原始代码 - 只依赖 user 状态
|
||
<Avatar
|
||
size="22"
|
||
src={user?.avatar} // 如果 user.avatar 为空,头像不显示
|
||
/>
|
||
<Text className={'text-white'}>{user?.nickname || '已登录'}</Text> // 如果 user.nickname 为空,显示"已登录"
|
||
```
|
||
|
||
### 问题场景
|
||
1. 用户更新头像/昵称后,`useUser` hook 的状态可能还没有及时更新
|
||
2. 即使本地存储中已经保存了最新的头像和昵称,界面仍然显示旧的状态
|
||
3. 导致用户看到"已登录"而不是自己的头像和昵称
|
||
|
||
## 修复方案
|
||
|
||
### 1. 优化显示逻辑
|
||
修改头像和昵称的显示逻辑,增加本地存储作为备用数据源:
|
||
|
||
```typescript
|
||
// 修复后的代码 - 同时检查状态和本地存储
|
||
<Avatar
|
||
size="22"
|
||
src={user?.avatar || Taro.getStorageSync('Avatar')} // 优先使用状态,备用本地存储
|
||
/>
|
||
<Text className={'text-white'}>
|
||
{user?.nickname || Taro.getStorageSync('Nickname') || '已登录'} // 多层备用逻辑
|
||
</Text>
|
||
```
|
||
|
||
### 2. 添加状态监听
|
||
在 Header 组件中添加 `useEffect` 来监听用户信息变化:
|
||
|
||
```typescript
|
||
// 监听用户信息变化,当用户信息更新后重新检查
|
||
useEffect(() => {
|
||
if (isLoggedIn && user) {
|
||
console.log('用户信息已更新:', user);
|
||
}
|
||
}, [user, isLoggedIn])
|
||
```
|
||
|
||
### 3. 数据获取优先级
|
||
建立清晰的数据获取优先级:
|
||
1. **第一优先级**:`user` 状态中的数据(最新的内存状态)
|
||
2. **第二优先级**:本地存储中的数据(持久化备用数据)
|
||
3. **第三优先级**:默认显示文本("已登录")
|
||
|
||
## 修复效果
|
||
|
||
### ✅ 即时显示
|
||
- 用户更新头像/昵称后,界面立即显示最新信息
|
||
- 即使状态更新有延迟,也能从本地存储获取最新数据
|
||
|
||
### ✅ 数据一致性
|
||
- 确保界面显示与实际数据保持一致
|
||
- 避免出现"已登录"的错误显示
|
||
|
||
### ✅ 用户体验优化
|
||
- 用户操作后立即看到结果
|
||
- 减少界面闪烁和不一致的显示
|
||
|
||
## 技术细节
|
||
|
||
### 数据流向
|
||
```
|
||
用户更新 → updateUser() → 更新状态 + 本地存储 → 界面显示
|
||
↓
|
||
状态可能延迟 → 本地存储作为备用 → 确保界面正确显示
|
||
```
|
||
|
||
### 显示逻辑优化
|
||
```typescript
|
||
// 头像显示逻辑
|
||
const avatarSrc = user?.avatar || Taro.getStorageSync('Avatar');
|
||
|
||
// 昵称显示逻辑
|
||
const displayName = user?.nickname || Taro.getStorageSync('Nickname') || '已登录';
|
||
```
|
||
|
||
### 状态监听机制
|
||
```typescript
|
||
useEffect(() => {
|
||
if (isLoggedIn && user) {
|
||
// 用户信息更新时的处理逻辑
|
||
console.log('用户信息已更新:', user);
|
||
}
|
||
}, [user, isLoggedIn]);
|
||
```
|
||
|
||
## 相关文件修改
|
||
|
||
### src/pages/index/Header.tsx
|
||
1. **第216行**:修改头像显示逻辑,添加本地存储备用
|
||
2. **第217行**:修改昵称显示逻辑,添加多层备用机制
|
||
3. **第194-197行**:添加用户信息变化监听
|
||
|
||
### 修改前后对比
|
||
```typescript
|
||
// 修改前
|
||
<Avatar size="22" src={user?.avatar} />
|
||
<Text className={'text-white'}>{user?.nickname || '已登录'}</Text>
|
||
|
||
// 修改后
|
||
<Avatar size="22" src={user?.avatar || Taro.getStorageSync('Avatar')} />
|
||
<Text className={'text-white'}>{user?.nickname || Taro.getStorageSync('Nickname') || '已登录'}</Text>
|
||
```
|
||
|
||
## 防护机制
|
||
|
||
### 多层备用策略
|
||
1. **状态优先**:优先使用内存中的最新状态
|
||
2. **存储备用**:状态为空时使用本地存储数据
|
||
3. **默认显示**:都为空时显示默认文本
|
||
|
||
### 数据同步保障
|
||
- `useUser` hook 确保状态和存储的同步
|
||
- Header 组件监听状态变化,及时响应更新
|
||
- 本地存储作为可靠的备用数据源
|
||
|
||
### 错误处理
|
||
- 避免因状态延迟导致的显示错误
|
||
- 确保在各种情况下都有合适的显示内容
|
||
- 提供友好的用户体验
|
||
|
||
## 测试建议
|
||
|
||
### 测试场景
|
||
1. **正常更新**:更新头像/昵称后检查显示是否正确
|
||
2. **状态延迟**:模拟状态更新延迟,检查备用机制是否生效
|
||
3. **数据清空**:清空状态数据,检查是否能从存储获取
|
||
4. **完全清空**:清空所有数据,检查是否显示默认文本
|
||
|
||
### 验证方法
|
||
```javascript
|
||
// 检查显示数据来源
|
||
console.log('用户状态:', user?.nickname);
|
||
console.log('本地存储:', Taro.getStorageSync('Nickname'));
|
||
console.log('最终显示:', user?.nickname || Taro.getStorageSync('Nickname') || '已登录');
|
||
```
|
||
|
||
## 总结
|
||
通过优化显示逻辑和添加本地存储备用机制,我们成功解决了头像昵称显示问题。这个解决方案:
|
||
|
||
1. **可靠性高**:多层备用机制确保数据显示的可靠性
|
||
2. **响应及时**:即使状态更新有延迟也能正确显示
|
||
3. **用户友好**:避免了"已登录"的错误显示
|
||
4. **易于维护**:逻辑清晰,便于后续维护和扩展
|
||
|
||
现在用户更新头像和昵称后,界面会立即显示正确的信息,不再出现"已登录"的问题。
|