开发者问题收集

从 Firebase 实时数据库检索时未定义数组(但事实并非如此)

2021-07-16
238

我正在尝试从Firebase实时数据库中检索数据,然后将其传递另一个功能。 但这引发了一个错误 typeError:Undefined不是对象(评估'notesList.map')

313854694

这是 console.log(notesList)

“

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