2 回答
TA贡献1883条经验 获得超3个赞
看起来您的数据被 Firebase SDK 解释为数组,因为它以连续的数字键开头。如果打印快照的值gebruikers
,您会看到它是:
[null, null, null, {email: "test", uid: "test"}, {email: "wouter@...", uid: "..."}]
这些null
值由 Firebase SDK 添加,以将键转换为正确的数组。
如果您希望阻止 Firebase SDK 将数据转换为数组,请在键前添加非数字字符。例如:
"key2": {email: "test", uid: "test"}, "key3": {email: "wouter@...", uid: "..."}
一般来说,使用用户的 UID 作为用户集合中的键更为惯用。这样,您就不需要查询 UID,并且会自动保证每个用户/UID 只能出现在集合中。
TA贡献1796条经验 获得超10个赞
我更改了数据库,就像您在此处看到的那样。正如 Frank 所预测的那样,我的问题根源在于我没有发布的函数。
通过将从数据库获取的所有 UID 索引转换为连续的数字键,我成功地使 forEach 函数正常工作。我这样做是使用users = Object.values(users).filter((el) => {return el != null}). 完整的效果钩子可以在下面找到:
useEffect(() => {
var refCodes = firebase.database().ref("userdata/" + currentUser.uid + "/docentCodes").orderByKey();
refCodes.once("value").then(function (snapshotCodes) {
snapshotCodes.val().forEach(function (code) {
var refCodeData = firebase.database().ref("klassencodes/" + code).orderByKey();
refCodeData.once("value").then(function (snapshotCodeData) {
var users = snapshotCodeData.val().gebruikers;
users = Object.values(users).filter((el) => {return el != null})
if(snapshotCodeData.val() !== null) {
setUsercount(oldArray => [...oldArray, users.length]);
setKlasData(oldArray => [...oldArray, snapshotCodeData.val()]);
setUserdata(oldArray => [...oldArray, users]);
addCode(oldArray => [...oldArray, code])
}
setPending(false);
})
})
})
}, []);
在使用此 useEffect 的函数中,我添加了const [userdata, setUserdata] = React.useState([]);从 UID 索引剥离到由数字键组成的索引的新信息。该用户数据被导出到另一个函数,该函数具有原始问题中所述的效果钩子。我将其更改为:
useEffect(() => {
if(props.userData !== undefined) {
var data = props.userData;
if(data !== undefined) {
data.forEach(function (user) {
if(!emails.hasOwnProperty(user.email)) {
addEmail(oldArray => [...oldArray, user.email]);
addUID(oldArray => [...oldArray, Object.keys(props.klasData.gebruikers)]);
}
setPending(false)
})
}
}
}, []);
概括
回想起来,我应该只为用户数据 ( ) 使用单独的常量snapshotCodeData.val().gebruikers,与从快照 ( snapshotCodeData.val()) 返回的其他数据分开。
我希望这可以帮助你。黄金代码行是users = Object.values(users).filter((el) => {return el != null}).
添加回答
举报