我有一个简单的Vue应用程序与Bulma Navbar和简单的组件.我正在使用Firebase进行身份验证.附录:

<script setup>
import { RouterLink, RouterView } from "vue-router";
import NavBar from "@/components/Navbar.vue"
</script>

<template>
    <NavBar />
    <RouterView />
</template>

<style lang="scss">
@import 'bulma/css/bulma.min.css';
</style>

问题是我的导航栏是在判断用户状态之前呈现的.因此,用户已登录,但Navbar呈现的效果就像用户未登录一样.

以下是导航栏在用户未登录时的外观-登录和注册可用:

模板使用标志和v-if来呈现元素:

        <a v-if="!isLoggedIn" class="navbar-item">
            <RouterLink to="/login" @click="burgerActive = 0">Login
            </RouterLink>
        </a>
        <a v-if="!isLoggedIn" class="navbar-item">
            <RouterLink to="/signup" @click="burgerActive = 0">Sign up</RouterLink>
        </a>

使用onMounted挂钩设置标志.

问题是,模板是在设置用户标志之前呈现的.我try 了调试,以下是通过放置一些日志(log)获得的结果:

onMounted(() => {
    console.log('1: entered onMounted', isLoggedIn.value, isAdmin.value)
    onAuthStateChanged(auth, (user) => {
        console.log('2: onAuthStateChanged invoked')
        if (user) {
            isLoggedIn = true
            userName = user.displayName
            user.getIdTokenResult().then((idTokenResult) => {
                isAdmin = idTokenResult.claims.admin
                console.log('3: user flags set', isLoggedIn.value, isAdmin.value)
            })
        } else {
            isLoggedIn = false
            isAdmin = false
        }
    })
    console.log('4: after onAuthStateChanged', isLoggedIn.value, isAdmin.value)
})

我的理解和期望是,在挂载时,会进行身份验证、设置标志并呈现模板.我在控制台输出中得到的结果证明我错了:

enter image description here

结果是,导航栏呈现为用户未登录.但仅在页面加载时使用.

我如何知道用户实际上已登录?我的依赖于用户的内容可以正确呈现.

如果我单击任何导航栏按钮,它会重新呈现属性,其中隐藏了LoginSign up个元素.

我错过了什么吗?

推荐答案

在这里,isLoggedIn = false是一个错误.如果变量是react 性的,则不应在组件中重新赋值.这种react 性不可能在JS中实现,特别是在Vue中.它始终是需要更改的对象属性.

推荐人应为const,以避免意外重新分配:

const isLoggedIn = ref(false);
...
isLoggedIn.value = true;

这只适用于组件的脚本部分,而不适用于模板,引用由Vue编译器在模板中展开.

Vue.js相关问答推荐

Nuxt.js i18n不提供默认区域设置中的页面而不重定向

VueJS使所有组件崩溃,而不是只有一个

当用户在嵌套路由中时激活链接

v-slot: activator 中 {attrs} 参数的作用是什么?

Vue:将点击事件绑定到动态插入的内容

Webpack 导入的模块不是函数

Vue子组件等待props

Vue + Webpack 构建显示空白页面

如何使用带有自定义标签和类的`transition-group`

使用 vue.js 的 axios 预检失败错误 301

即使在客户端设置 Access-Control-Allow-Origin 或其他 Access-Control-Allow-* 标头后也出现 CORS 错误

使用 Blade/Mustache 模板混合 Laravel 和 Vue.Js

SassError:媒体查询表达式必须以(开头

Vue.js 无法切换字体真棒图标

Laravel 中的 VueJS 组件实现中的鼠标悬停

如何使用 TypeScript 在 Vue.js 中指定非react性实例属性?

'不提供名为'createRouter'的导出'' vue 3、vite 和 vue-router

如何在 JEST 测试中模拟全局 Vue.js 变量

$set 不是函数

$emit 不会触发子事件