vue登录成功后导航栏获取不到用户信息

需求: 使用v-if判断localStorage(或sessionStorage)中是否存在用户信息来识别用户是否登录,进而更新导航栏上的用户信息
问题: 当登录请求完成后,数据已经存入localStorage中,但是v-if的条件值没有改变,仍然显示用户未登录
原因分析: 由于登录成功后马上跳转回主页,导致存localStorage操作与路由跳转几乎同时进行,所以跳转回主页后,localStorage还没有存入完成,获取不到用户信息
解决方法:
1.方法一: 在登陆成功后对跳转路由操作进行延时处理,添加如下代码:

setTimeout(() => { //延时0.5s跳转主页,用于主页获取localStorage中用户信息争取时间
   this.$router.push('/')
}, 500)

通过延时跳转为主页获取localStorage中用户信息争取时间即可解决
2. 方法二: 监听登录状态

由于登录页面属于App.vue的子组件,导航栏也属于App.vue的子组件,所以可以先将登录后的用户信息传到App.vue,再由App.vue将用户信息传到导航栏,导航栏监听用户信息,有变化时更新页面。

通过$emit事件将登陆后获取到的用户信息传给父组件App.vue

.then(res => {
	 if (res.code == 200) {
	     this.$message.success(res.msg);
	     sessionStorage.setItem('userInfo', JSON.stringify(res.data))
	     this.$emit('event', res.data); //将用信息传给UserPage用来更新状态栏
	     this.$router.push('/user/index');
     } else {
        this.$message.error(res.msg);
     }
})

在App.vue使用"@event=“getUserInfo”“接收用户信息,当App.vue获取到用户信息后通过”:user=“userInfo”"将数据传到导航栏

<template>
    <div id="user-page">
        <UserBar :user="userInfo"></UserBar>
        <div class="box">
            <router-view @event="getUserInfo"></router-view>
        </div>        
    </div>
</template>
<script>
import UserBar from '@/components/navbar/UserBar.vue'
export default {
    components: {
        UserBar,
    },
   data() {
      return {
        userInfo: {}
      }
   },
   methods: {
    getUserInfo(data) { //接收UserLogin传来的用户信息,默认回调参数data就是$emit中的第二个参数,当接收到时会触发标签上的@event事件
        this.userInfo = data
    }
   }
}
</script>

导航栏通过watch监听用户信息的变化,在接收到数据时会改变用户信息

<script>
export default {
    props: ['user'], //接收UserPage传来的用户信息
    data() {
        return {            
            active: '',           
            userInfo: this.userInfo = JSON.parse(sessionStorage.getItem('userInfo'))
        }
    },
    watch: {
        user: { //监听UserPage传来的用户信息,这个user就是通过props传来的user
            handler(newVal) {
                if(newVal==null) { //若发生改变,但最新的值为空,则到sessionStorage取值,若取不到则未登录
                    this.userInfo = JSON.parse(sessionStorage.getItem('userInfo'))
                } else {
                    this.userInfo = newVal //若发生改变,将最新的值赋给this.userInfo
                }
            }
        },
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例代码,实现了一个顶部导航栏,点击右边的标题会跑到间: ``` <template> <div class="nav"> <div class="nav-left"> <span class="nav-title">左侧标题</span> </div> <div class="nav-center"> <span class="nav-title">{{ currentTitle }}</span> </div> <div class="nav-right"> <span class="nav-title" @click="scrollToCenter">右侧标题</span> </div> </div> </template> <script> export default { data() { return { currentTitle: '间标题' } }, methods: { scrollToCenter() { // 获取间标题的位置 const centerTitle = document.querySelector('.nav-center .nav-title') const centerTitleRect = centerTitle.getBoundingClientRect() const centerTitleOffset = centerTitleRect.left + centerTitleRect.width / 2 // 滚动到间标题的位置 window.scrollTo({ left: centerTitleOffset - window.innerWidth / 2, behavior: 'smooth' }) } } } </script> <style scoped> .nav { display: flex; align-items: center; justify-content: space-between; height: 50px; background-color: #eee; font-size: 18px; font-weight: bold; padding: 0 20px; } .nav-title { cursor: pointer; } .nav-center { flex-grow: 1; text-align: center; } </style> ``` 在这个示例,顶部导航栏被划分为三个部分:左侧、间和右侧。间部分显示当前的标题,右侧部分的标题被点击时,页面会滚动到间标题的位置。 为了实现滚动效果,我们使用了 `window.scrollTo()` 方法,将页面滚动到指定的位置。在这个方法,我们需要传入一个对象,包含两个属性:`left`(水平滚动距离)和 `behavior`(滚动行为,可以是 "auto"、"smooth" 或 "instant")。 注意,在 `scrollTo()` 方法计算滚动距离时,我们使用了 `window.innerWidth` 属性,这是窗口的内部宽度,也就是视口的宽度,不包括滚动条的宽度。我们可以用这个属性计算出间标题的位置和窗口的滚动距离。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值