在开发小程序用户登录功能时,用wx.login获取code后调用接口登录,但跳转到个人中心页面时数据没刷新,还要手动刷新才能显示登录状态。
尝试过用wx.navigateTo跳转,也试过setData更新state,但页面还是显示未登录状态。这是我的CSS布局代码:
.user-info {
display: flex;
align-items: center;
visibility: var(--user-visibility, hidden);
}
控制台没报错,就是数据不同步,求大神指点!
首先,CSS那部分其实不是关键问题,重点在登录流程的处理。你的
visibility控制方式是对的,但数据没及时更新。正确流程应该这样走:
1. 在app.js里定义全局状态,比如:
2. 登录成功后,要同时做三件事:
3. 在个人中心页面的onShow里检查状态:
这里需要注意几个关键点:
1. 不要用navigateTo跳tabbar页面,要用switchTab
2. 加时间戳参数强制刷新页面
3. 全局状态和页面data要分开管理
4. 生命周期函数要用对,onLoad只在初次加载执行,onShow每次显示都会触发
你的CSS可以配合这样用:
JS里这样控制:
我上次做项目也踩过这个坑,调试了半天发现是生命周期搞错了。如果还有问题,可以检查下后端返回的userInfo结构是否和前端匹配。
wx.navigateTo跳转的话,目标页面并不会重新加载,所以登录状态的数据可能没有及时更新。建议你在登录成功后,使用
wx.setStorageSync把登录状态存储到本地缓存中,比如存一个 token 或者用户信息。然后在跳转到个人中心页面时,先通过onShow生命周期函数去检查缓存中的状态,确保每次页面展示时都能同步最新的数据。代码可以这样写:
注意安全:不要直接把敏感信息比如 token 存在本地缓存里,最好加密一下,或者只存一个标识符,具体数据还是从服务器拉取。另外,记得在服务端校验 token 的合法性,防止被伪造。
至于你的 CSS 部分,看起来是用
visibility控制显示隐藏,这个没问题,但建议结合登录状态动态设置样式,比如在setData中更新--user-visibility的值。最后提醒一下,调试的时候多看看网络请求和缓存是否正常,避免因为缓存未清除导致问题难以复现。