首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Vue显示检查localStorage键的按钮?

如何用Vue显示检查localStorage键的按钮?
EN

Stack Overflow用户
提问于 2022-09-24 12:47:24
回答 2查看 88关注 0票数 1

当我注销时,我会删除令牌。下面是我如何检查令牌是否被删除:

代码语言:javascript
复制
  const isLoggedOut = () => {
    let token = window.localStorage.getItem('token')
    if (token === undefined || token === null || token.length === 0) {
      console.log("user is logged out")
      return true
    }
    else {
      console.log("user is logged in")
      return false
    }
  }

在导航栏中,如果用户登录,我希望Login按钮被隐藏。这就是导航条的样子:

代码语言:javascript
复制
  <nav class="navbar navbar-expand-sm bg-dark navbar-dark">
    <router-link class="navbar-brand" :to="{ name: 'Home' }">Home</router-link>
    <ul class="navbar-nav">
        <li class="nav-item">
            <router-link class="text-white" :to="{ name: 'Login' }" v-if="isLoggedOut">Login</router-link>
        </li>
        <li class="nav-item">
            <router-link class="text-white ml-2" :to="{ name: 'Register' }">Register</router-link>
        </li>
        <li class="nav-item">
            <router-link class="text-white ml-2" :to="{ name: 'Dashboard' }">Dashboard</router-link>
        </li>
        <li class="nav-item">
            <button class="text-white ml-2" @click="logOut">Logout</button>
        </li>
    </ul>
  </nav>

稍后编辑,这是没有样式的App.vue文件。我登录,登录按钮仍然出现在导航栏中。

代码语言:javascript
复制
<script setup>
  import { reactive,ref, computed } from 'vue'
  import { useRouter } from "vue-router"

  const router = useRouter()

  const token = ref(null);
  const setToken = (token) => {
    token.value = token;
    window.localStorage.setItem('token', token)
  } 
  const clearToken = () => {
    token.value = null;
    window.localStorage.removeItem('token')
  }

  const isLoggedOut = computed(() => token.value === null)

  const logOut = () => {
    clearToken()
    router.push({name:'Login'})
  }

</script>

<template>
  <nav class="navbar navbar-expand-sm bg-dark navbar-dark">
    <router-link class="navbar-brand" :to="{ name: 'Home' }">Home</router-link>
    <ul class="navbar-nav">

        <!-- Show Login button only if user is logged out -->
        <li class="nav-item">
            <router-link class="text-white" :to="{ name: 'Login' }" v-if="isLoggedOut">Login</router-link>
        </li>
        
        <li class="nav-item">
            <router-link class="text-white ml-2" :to="{ name: 'Register' }">Register</router-link>
        </li>
        <li class="nav-item">
            <router-link class="text-white ml-2" :to="{ name: 'Dashboard' }">Dashboard</router-link>
        </li>
        <li class="nav-item">
          <button class="text-white ml-2" @click="logOut">Logout</button>
        </li>
    </ul>
  </nav>
  <router-view/>
</template>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-25 12:58:48

该按钮仍然是可见的,因为组件(在您的情况下是App.vue)没有重新加载,这意味着没有执行是否有令牌的检查,由于上面提到的window.localStorage不是反应性的,因此计算结果不会被更新。

克服这一问题的一种方法是使用存储(pinia/vuex/composable )和路由器挂钩(如beforeRouteEnter或全局One - beforeEach )。

您还可以尝试使localStorage像本例中的这里那样具有反应性。

这可能有点过火了。

只需确保您将令牌函数和操作移动到一个分离的文件中(甚至作为一个可组合文件)。

票数 0
EN

Stack Overflow用户

发布于 2022-09-24 15:02:35

window.localStorage.getItem('token')不是反应性的。如果值发生变化,则不会通知您。

您可以通过内部状态管理它,然后通过内部状态管理本地存储,而不是从localStorage获得登录状态。

例如:

代码语言:javascript
复制
const token = ref(null);
const setToken = (value) => {
  token.value = value;
  window.localStorage.setItem('token', token)
} 
const clearToken = () => {
  token.value = null;
  window.localStorage.removeItem('token')
}
const isLoggedIn = computed(()=>token.value !== null)

然后可以使用isLoggedIn作为反应性(计算)值。

您可以将其存储在单独的auth.js中,并导出方法和令牌。

示例

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73837340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档