从 Firebase 实时数据库检索时未定义数组(但事实并非如此)
2021-07-16
238
3个回答
因为
noteList
未定义 ->
const[notesList, SetNotesList] = useState();
因此,请检查 noteList 是否存在,以便在异步提取完成时调用 map。
您也可以像这样初始化 noteList ->
const[notesList, SetNotesList] = useState([]);
以下代码应该可以工作。
...
return (
<View style={styles.list}>
<ScrollView>
<Search />
<Add />
{notesList && notesList.map((note) => (<Note text = {text} date = {date}/>))}
</ScrollView>
</View>
)
}
...
GregMit
2021-07-16
作为 @Dharmaraj 的 答案 的替代方案,您还可以引入一个“loading”变量,如下所示:
注意
:请务必查看其他更改,例如一些变量名称,使用
DataSnapshot#forEach()
来维护查询的顺序,
分离快照侦听器
,
快照错误处理
和
确保在
map()
函数中设置了
key
属性
。
let renderCount = 0; // just for debugging, remove it later
function NotesList() {
const [notesList, setNotesList] = useState();
const notesLoading = notesList === undefined;
useEffect(() => {
const notesQueryRef = firebase.database()
.ref('localnotes-data');
// you can add `orderByChild()`, etc. to the above query
const listener = notesQueryRef.on(
'value',
(snapshot) => {
const notesArray = [];
snapshot.forEach(noteSnapshot =>
const id = noteSnapshot.key;
notesArray.push({
id: noteSnapshot.key,
...noteSnapshot.val()
});
);
setNotesList(notesArray);
},
(error) => {
// TODO: Handle errors better than this
console.error("Failed to get notes: ", error);
}
);
// return cleanup function
return () => {
notesQueryRef.off('value', listener);
};
}, []);
// just for debugging, remove it later
console.log({
renderCount: ++renderCount,
notesLoading,
notesList
});
return (
<View style={styles.list}>
<ScrollView>
<Search />
<Add />
{notesLoading
? <Spin tip="Loading..." key="loading" />
: notesList.map(note => (<Note
text={note.text}
date={note.date}
key={note.key}
/>));
}
</ScrollView>
</View>
)
}
const styles = StyleSheet.create({
list: {
marginTop: 0,
marginBottom: 145,
}
})
export default NotesList
samthecodingman
2021-07-16
我认为这是因为
notesList
的初始状态未定义。尝试将其设置为空数组。
const [notesList, SetNotesList] = useState([]);
^^
现在
notesList
已定义,您可以在其上运行
map()
方法。
Dharmaraj
2021-07-16