【问题标题】:User.displayName not accessible inside the script but available in template in VueJs?User.displayName 在脚本中无法访问,但在 VueJs 的模板中可用?
【发布时间】:2021-09-25 09:27:08
【问题描述】:

我在我的函数中导入了一个当前用户可组合,但是当我尝试访问用户对象的任何属性时它返回未定义。您能帮帮我吗,我是 Vue 新手?

这是我在其中调用用户属性的模板。

<template>
  <p>Process Payroll</p>
  <h1>{{ user.displayName }} </h1>
  <h1>{{ docs }} </h1>
</template>

<script>
import getUser from '@/composables/getUser'
import { ref, onMounted } from 'vue'
import { projectFirestore, projectAuth } from '@/firebase/config'
import { useRouter, useRoute } from 'vue-router'

export default {
    setup() {
    const { user } = getUser();
    const lastName = ref("");
    const firstName = ref("");
    const docs = ref([]);

    const returnUser = async () => {
      const res = await projectFirestore
        .collection("users")
        .where("displayName", "==", user.displayName)
        .get();
      if (!error.value) {
        // check your response here.
        console.log(res);
        const doc = res.filter((userObj) => {
          if (user.displayName === userObj.data().displayName) {
            return user.lastName;
          }
        });
        docs.value = doc;
      }
    };

        onMounted(returnUser)

    return { user, docs, returnUser};
  },
}
</script>

User.displayName 在我的 returnUser 函数中未定义,但可以显示在顶部的模板中。如何在 returnUser 函数中访问 user.displayName 属性?

可组合:

import { ref } from 'vue'
import { projectAuth } from '../firebase/config'

// refs
const user = ref(projectAuth.currentUser)

// auth changes
projectAuth.onAuthStateChanged(_user => {
  console.log('User state change. Current user is:', _user)
  user.value = _user
});

const getUser = () => {
  return { user } 
}

export default getUser

【问题讨论】:

  • 似乎您可能在 projectAuth 回调更新用户之前调用了 returnUser。一种解决方案是使用像watch(()=&gt;user, () =&gt; returnUser()) 这样的手表。如果您正在处理的组件有父组件,那么另一种选择是让用户进入父组件并在此组件上使用 v-if="user" 并将用户作为道具传递给组件,以便仅创建它当用户可用而不是之前。
  • 你是否建议我这样包含它,因为这也不起作用:onMounted(watch(()=>user, () => returnUser())) @InvisibleGorilla
  • 直接在setup() 中使用手表,而不是在onMounted 中使用。因此,在const { user } = getUser(); 之后的任何时间设置中使用watch(()=&gt;user, () =&gt; returnUser())
  • 这样做时出现参考错误“ReferenceError:未定义错误”。如何继续从 firebase 发起内容请求。现在我没有看到任何事情发生。我想做的就是通过引用当前用户的 displayName 来显示来自 firebase 的姓氏和名字。有没有一种更简单的方法可以从数据库中检索姓氏和名字,或者有任何关于如何以不同方式获取姓氏和名字的想法?我在注册时将姓氏和名字与显示名称一起存储。

标签: vue.js vue-component


【解决方案1】:

好的,问题是returnUser 将被vue 调用,而不管当前用户的auth 状态如何。认证状态会在一瞬间左右被firebase改变,但到那时,你在returnUser中的代码已经执行了。在script 标签内自然给你undefined。但是,由于此属性是反应性的,所以当身份验证状态发生变化时它总是会发生变化,从而使用户详细信息在模板中可用。

解决方案是为user 属性设置一个观察程序,以便在用户的身份验证状态更改时调用returnUser 函数。可组合中的其余代码可以保持原样,因为它可以正常工作,因为您可以访问template 标记中的用户对象。

<template>
  <p>Process Payroll</p>
  <h1>{{ user.displayName }} </h1>
  <h1>{{ docs }} </h1>
</template>

<script>
import getUser from '@/composables/getUser'
import { ref, onMounted, watch } from 'vue'
import { projectFirestore, projectAuth } from '@/firebase/config'
import { useRouter, useRoute } from 'vue-router'

export default {
    setup() {
    const { user } = getUser();
    const lastName = ref("");
    const firstName = ref("");
    const docs = ref([]);

    const returnUser = async () => {
      const res = await projectFirestore
        .collection("users")
        .where("displayName", "==", user.displayName)
        .get();
      if (!error.value) {
        const doc = res.filter((userObj) => {
          if (user.displayName === userObj.data().displayName) {
            return user.lastName;
          }
        });
        docs.value = doc;
      }
    };

    onMounted(returnUser);
    watch(user, returnUser);

    return { user, docs, returnUser};
  },
}
</script>

编辑:我之前忘记从 vue 导入 watch 方法。更新了我的答案来做到这一点。

@BilalHussain 我还要说先试试我上面的答案。现在,关于获取名字和姓氏的更好方法的问题,我可以向您解释我为我的一个项目实施的内容。所以我使用firebase auth 进行身份验证和注册过程。当用户向firebase 注册时,您会得到一个不会更改的用户uid。所以我会将所有用户数据存储在一个集合中,以 uid 作为文档 ID。

示例:
Collection Doc Document data
users xasdfoxkawe4s7sa4fa55w525asdfalsuw { first: "John", lastName: "Doe" }
asiu82kskadla1s85sdfklsuspalsjdjd { first: "Jack", lastName: "Sparrow" }

当用户登录时,在前端我总是有uid,所以我可以只查询该特定文档并获取数据,而不是使用以下语法搜索整个集合:

const currentUser = await firebase.auth().currentUser;
const user = await firestore.collection("users").doc(currentUser.uid).get();
console.log(user.data())

所以我相信,您可以使用类似的方法针对 firestore 中的唯一哈希创建文档。所以当用户登录时,你有哈希值,你可以直接从 firestore 查询它。希望这会有所帮助!

参考资料:

【讨论】:

    猜你喜欢
    • 2017-06-23
    • 2020-09-17
    • 1970-01-01
    • 2020-07-11
    • 2019-05-25
    • 1970-01-01
    • 2019-06-06
    • 2017-08-16
    • 2013-10-28
    相关资源
    最近更新 更多