我想将React Hooks功能与Firebase结合使用。但是现在设置数据后,结果仅在更新DOM时可见。 我当前的代码是:
import React, { useState, useEffect } from 'react';
import firebase, { getPivotFunction } from '../../firebase';
/**
* Return a styled component
*/
const ListCards = () => {
const [data, setData] = useState([]);
const userListsRef = firebase
.database()
.ref('userLists')
.child('1234d343f');
useEffect(() => {
(async function() {
try {
const response = await getPivotFunction(userListsRef, 'lists');
setData(response);
} catch (e) {
console.error(e);
}
})();
}, []);
/**
* Return all list cards
*/
return (
<ul>
{data.map(item => (
<li key={item.time}>dummy text</li>
))}
</ul>
);
};
第一次蜂鸣呈现页面时,仅当触发了更新蜂鸣时,才显示“虚拟文本”。
我的目标是在页面加载完成且data
的长度不为0时显示“虚拟文字”。
在这种情况下,getPivotFunction
包含:
/** Get FireBase data based on a pivot table */
const getPivotFunction = (ref, target) => {
let dataArray = [];
ref.once('value', userInfo => {
userInfo.forEach(function(result) {
firebase
.database()
.ref(target)
.child(result.key)
.on('value', snapshot => {
dataArray.push(snapshot.val());
});
});
});
return dataArray;
};
请让我知道
答案 0 :(得分:2)
您的getPivotFunction
是一个异步函数,它依赖于回调,而使用async await on是不正确的方法。相反,您需要有一个回调
/** Get FireBase data based on a pivot table */
const getPivotFunction = (ref, target, callback) => {
const dataArray= [];
ref.once('value', userChats => {
var i = 0;
userChats.forEach(function(result) {
firebase
.database()
.ref(target)
.child(result.key)
.on('value', snapshot => {
i++;
dataArray.push(snapshot.val());
if(i === userChats.length) {
callback(dataArray)
}
});
});
});
};
并像使用它
/**
* Return a styled component
*/
const ListCards = () => {
const [data, setData] = useState([]);
const userListsRef = firebase
.database()
.ref('userLists')
.child('1234d343f');
useEffect(() => {
getPivotFunction(userListsRef, 'lists', (response) => {
setData(response);
});
}, []);
/**
* Return all list cards
*/
return (
<ul>
{data.map(item => (
<li key={item.time}>dummy text</li>
))}
</ul>
);
};
答案 1 :(得分:0)
挂钩并不意味着可以使用这样的异步功能。这样的事情应该起作用:
const ListCards = () => {
const [data, setData] = useState([]);
const [loaded, setLoaded] = useState(false);
...
useEffect(() => {
getPivotFunction(userListsRef, 'lists')
.then(data => { setData(data); setLoaded(true)});
}, []);
};
然后仅在loaded
为true
时渲染。