【问题标题】:Firebase Data Read Problem When Reload Page - Vue.js重新加载页面时的 Firebase 数据读取问题 - Vue.js
【发布时间】:2019-03-04 05:02:42
【问题描述】:

我正在尝试为用户创建个人资料页面。

我创建了登录/注册页面,并且正在使用 firebase 身份验证。当我尝试获取用户数据时,一切正常,但如果重新加载个人资料页面,我将看不到任何数据。 (我需要先去别的地方,然后再回到个人资料页面,一切都会好起来的。)

我正在使用 vue.js,这两种技术都比较新。

我试图了解生命周期(也尝试了所有选项),但我无法解决问题。

<template>
<div>
    <h2>Profile</h2>
    <h6><b>User Name:</b> {{details.name}} </h6>
    <h6><b>User Email:</b> {{details.email}} </h6>
    <h6><b>User photoUrl:</b> {{details.photoUrl}} </h6>
    <h6><b>User uid:</b> {{details.uid}} </h6>
    <h6><b>User EmailVerified:</b> {{details.emailVerified}} </h6>
</div>
</template>

<script>
import firebase from 'firebase'

    export default {
        data() {
            return {
                user: firebase.auth().currentUser,
                details: {
                    name: '', 
                    email: '', 
                    photoUrl: '', 
                    uid: '', 
                    emailVerified: ''
                }
            }
        },
        created(){
            if(this.user){
                console.log('There is a user')
                this.details.name = this.user.displayName,
                this.details.email = this.user.email,
                this.details.photoUrl = this.user.photoURL,
                this.details.emailVerified = this.user.emailVerified,
                this.details.uid = this.user.uid

            } else {
                console.log('No user')
            }
        },
        methods: {

        },
    }
</script>

【问题讨论】:

  • 你试过用mounted代替created吗?
  • @ThomasLombart 是的,它就像创建的一样(结果相同)

标签: firebase vue.js vuejs2 firebase-authentication


【解决方案1】:
   <template>
<div v-if="user">
    <h2>Profile</h2>
    <h6><b>User Name:</b> {{user.displayName}} </h6>
    <h6><b>User Email:</b> {{user.email}} </h6>
    <h6><b>User photoUrl:</b> {{user.photoUrl}} </h6>
    <h6><b>User uid:</b> {{user.uid}} </h6>
    <h6><b>User EmailVerified:</b> {{user.emailVerified}} </h6>
</div>
</template>


 <script> import firebase from 'firebase'

    export default {
        data() {
            return {
                user: null
                }
            }
        },
        created(){
        firebase.auth().onAuthStateChanged(function(user) {
          if (user) {
                this.user = user
             } else {
                console.log('No user')
                this.user = null
                }
              });

        },
        methods: {

        },
    } </script>

推荐的获取用户的方式是通过监听器,这里也有更深入的描述https://firebase.google.com/docs/auth/web/manage-users

我还编辑了您的代码,以使您的代码更少但结果相同。

【讨论】:

  • 它工作得很好,我想主要问题源于在 data()中使用这一行 "user: firebase.auth().currentUser," > 部分。你怎么看?
  • 我说它工作但现在我检查了控制台有一个错误。 (我可以在屏幕上看到所有数据,但控制台上的错误阻止添加其他内容。)[Vue 警告]:渲染错误:“TypeError:无法读取属性 'displayName' of null”
  • @CanerSezgin 我在工作,所以我无法复制它,您能否尝试在通过我在上面的帖子中编辑的v-if 语句实际填充用户之前不呈现内容。告诉我你的结果
  • 非常感谢,
【解决方案2】:

我通常将初始的 firebase 身份验证状态逻辑保留在 Vue 实例之外(然后像往常一样使用 vue 方法在加载后进行页面交互)。

使用您打算使用的键初始化您的 vue 数据用户对象,并为 v-if 查找用户 uid(因为所有用户都将拥有此,包括匿名用户)。

您还可以确保 onAuthStateChanged 在用户数据更新之前已执行(不记得您是否可以假设它会在创建 vue 实例之前执行,但这将确保您不会加载在创建 vue 实例后出现的用户数据以防万一)通过在 onAuthStateChanged 执行时将布尔值(例如 authChecked)从 false 更改为 true,并使用自行运行的方法(在“created”中使用)如果 authChecked 还不是真的,一次又一次地使用 setTimeout。

所有这些(以及下面的一些其他细微添加)将确保您只显示您拥有的数据,不会收到您遇到的错误,并且如果在创建 vue 实例后 firebase 碰巧检索到用户数据,则会加载用户数据例如

<template>
    <div v-if="user.uid">
        <h2>Profile</h2>
        <h6 v-if="user.displayName"><b>User Name:</b> {{user.displayName}} </h6>
        <h6 v-if="user.email"><b>User Email:</b> {{user.email}} </h6>
        <h6 v-if="user.emailVerified"><b>User EmailVerified:</b> {{user.emailVerified}} </h6>
        <h6 v-if="user.photoUrl"><b>User photoUrl:</b> {{user.photoUrl}} </h6>
        <h6><b>User uid:</b> {{user.uid}} </h6>
    </div>
</template>

<script>
import firebase from 'firebase'

const auth = firebase.auth()
var authChecked = false;

var user = auth.onAuthStateChanged(function(user) {
    if(user) {
        return user
    } else {
        return null
    }
    authCkecked = true;
})

export default {
    data() {
        return {
            user: {
                displayName: ""
                email: ""
                emailVerified: "" 
                photoUrl: ""
                uid: ""
            }
        }
    },
    created() {
        this.updateUser;
    },
    methods: {
        updateUser() {
            if (authChecked) {
                if (user) {
                    this.user = user
                } else {
                    console.log('No user')
                }
            } else {
                setTimeout(this.updateUser, 200)
            }
        }
    }
}
</script>

【讨论】:

  • 感谢您的贡献,但我不明白为什么要使用此方法而不是 Badgy 的方法。你能解释一下吗?
  • 据我所知,在调用 vue 实例上创建的生命周期挂钩时,firebase 可能尚未初始化,这可能会导致其他错误。我的调整确保在初始化 firebase 并随后检查经过身份验证的用户之前,您不会尝试更新用户数据。
猜你喜欢
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 2020-09-25
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
相关资源
最近更新 更多