![](/img/trans.png)
[英]How to reference a VueUse useFirestore ref in another useFirestore?
[英]How to use VueUse useFirestore() with a Where QueryConstraint?
我有一個看起來像這樣的 Firestore users
文檔:
{
currentCompanyId: "123",
displayName: "Mary Jane"
}
還有一個看起來像這樣的 Firestore websites
文檔:
{
companyId: "123",
homePageUrl: "https://www.google.com/"
}
現在我正在嘗試使用 VueUse useFirestore()包裝器來顯示websites
文檔。
為此,我在where
Query Constraint 中引用users
文檔的currentCompanyId
屬性,如下所示:
<template>
<div>
{{ websites?.[0] }}
</div>
</template>
<script setup lang="ts">
import { useAuth } from '@vueuse/firebase/useAuth';
import { useFirestore } from '@vueuse/firebase/useFirestore';
import { collection, doc, query, where } from 'firebase/firestore';
import { auth, db } from 'src/config/firebase';
import { User } from 'src/types';
import { computed } from 'vue';
const { user: authUser } = useAuth(auth);
const userDocRef = doc(db, `users/${authUser.value?.uid}`);
const user = useFirestore<User>(userDocRef);
const websiteQuery = computed(() =>
query(
collection(db, 'websites'),
where('companyId', '==', user.value?.currentCompanyId) // This produces an error
// where('companyId', '==', '123') // This works, but is not practical
)
);
const websites = useFirestore(websiteQuery);
</script>
硬編碼123
的companyId
值有效。
但是,每當我在計算的 ref 中使用user.value?.currentCompanyId
時,它都會拋出一個錯誤,說明如下:
TypeError:“in”的右側應該是 object,得到 null
僅當值定義如下時才嘗試傳遞QueryConstraint
:
const websiteQuery = computed(() => {
const queryContraints: any = [];
const currentCompanyId = user.value?.currentCompanyId;
if (currentCompanyId) queryContraints.push(where("companyId", "==", currentCompanyId));
return query(
collection(db, 'websites'),
...queryContraints
)
});
但是,如果您不提供where()
約束,這將返回所有文檔,因此可能僅在定義此約束時嘗試運行查詢,即在 auth state 已加載之后。 onAuthStateChanged()
在這里可能有用。
我想到了。
問題是user.value?.currentCompanyId
最初是null
。
這是錯誤消息:
TypeError:“in”的右側應該是 object,得到 null
它基本上是說Where
查詢約束的右側應該是 object,但它得到了 null。
將查詢包裝在computed
的 ref 中最終將在更新時將值從null
更改為其他值。 但最初它是null
。 這就是錯誤的原因。
為了克服這個問題,您可以在useFirestore
中設置user
的一些初始屬性。 因此, Where
查詢約束最初將使用該非空值。 即使是空字符串也可以。 您可以使用任何不是null
的東西。
這是完整的代碼:
<template>
<div>
{{ websites?.[0] }}
</div>
</template>
<script setup lang="ts">
import { useAuth } from '@vueuse/firebase/useAuth';
import { useFirestore } from '@vueuse/firebase/useFirestore';
import { collection, doc, query, where } from 'firebase/firestore';
import { auth, db } from 'src/config/firebase';
import { User } from 'src/types';
import { computed } from 'vue';
const { user: authUser } = useAuth(auth);
const userDocRef = doc(db, `users/${authUser.value?.uid}`);
const user = useFirestore<User>(userDocRef, { currentCompanyId: '' }); // <-- See change here
const websiteQuery = computed(() =>
query(
collection(db, 'websites'),
where('companyId', '==', user.value?.currentCompanyId)
)
);
const websites = useFirestore(websiteQuery);
</script>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.