在呈现 Firebase 结果时,对象作为 React 子项(找到:[object Promise])无效
Objects are not valid as a React child (found: [object Promise]) while rendering Firebase results
我收到以下错误:
Objects are not valid as a React child (found: [object Promise]). If you meant to render a collection of children, use an array instead.
我在 React 中使用了 context 并且在使用 props 时遇到了问题,因为我在内部组件中有 forEach
循环以从数据库中获取数据。
我不知道如何使用数组来呈现集合。
这是获取数据的代码,导致错误发生:
import React, { useEffect, useState } from "react";
import { db } from "../services/firebase";
import style from "./css/dashboard.module.css";
import InputTask from "./InputTask";
import Task from "./Task";
const Tasks = ({ user }) => {
console.log("Tasks");
return (
<>
<div className={style.card}>
<InputTask user={user} />
</div>
{true
? db
.collection("Users")
.doc(`${user.email}`)
.collection("tasks")
.get()
.then((querySnapshot) => {
querySnapshot.forEach((doc) => {
console.log(doc.id, " => ", doc.data());
return (
<div className={style.card}>
<Task todo={doc} />
</div>
);
});
})
: null}
</>
);
};
export default Tasks;
附上错误的快照here
你还没有从 react
导入 useContext
钩子
试试这个
import React, { useEffect, useState, useContext } from "react";
import { auth } from "../services/firebase";
export const AuthContext = React.createContext();
export const AuthProvider = (props) => {
const [loading, setLoading] = useState(true);
const [currentUser, setCurrentUser] = useState(null);
useEffect(() => {
auth.onAuthStateChanged((user) => {
setCurrentUser(user);
setLoading(false);
});
}, []);
if (loading) {
return <p>Loading...</p>;
}
// console.log(children);
return (
<AuthContext.Provider value={{ currentUser }}>
{props.children}
</AuthContext.Provider>
);
};
您的渲染方法(下面附上的部分)不会等到 .then
被触发。相反,它将 return 和 Promise
保持原样。因此你提到的Error: Objects are not valid as a React child (found: [object Promise])
。
{
true
? db
.collection("Users")
.doc(`${user.email}`)
.collection("tasks")
.get()
.then((querySnapshot) => {
querySnapshot.forEach((doc) => {
console.log(doc.id, " => ", doc.data());
return (
<div className={style.card}>
<Task todo={doc} />
</div>
);
});
})
: null
}
由于这是一个异步操作,所以这部分最好使用状态。例如,您可以在组件安装时获取数据(使用 useEffect
),将所有内容放入状态(使用 useState
),然后呈现状态。
import React, { useEffect, useState } from "react";
import { db } from "../services/firebase";
import style from "./css/dashboard.module.css";
import InputTask from "./InputTask";
import Task from "./Task";
const Tasks = ({ user }) => {
const [tasks, setTasks] = useState([]);
// fetching data again when user changes
useEffect(() => {
db
.collection("Users")
.doc(`${user.email}`)
.collection("tasks")
.get()
.then((querySnapshot) => {
setTasks(querySnapshot);
})
}, [user]);
return (
<>
<div className={style.card}>
<InputTask user={user} />
</div>
{tasks.length
? tasks.map((task) =>
<div className={style.card}>
<Task todo={task} />
</div>
)
: null}
</>
);
};
export default Tasks;
我收到以下错误:
Objects are not valid as a React child (found: [object Promise]). If you meant to render a collection of children, use an array instead.
我在 React 中使用了 context 并且在使用 props 时遇到了问题,因为我在内部组件中有 forEach
循环以从数据库中获取数据。
我不知道如何使用数组来呈现集合。
这是获取数据的代码,导致错误发生:
import React, { useEffect, useState } from "react";
import { db } from "../services/firebase";
import style from "./css/dashboard.module.css";
import InputTask from "./InputTask";
import Task from "./Task";
const Tasks = ({ user }) => {
console.log("Tasks");
return (
<>
<div className={style.card}>
<InputTask user={user} />
</div>
{true
? db
.collection("Users")
.doc(`${user.email}`)
.collection("tasks")
.get()
.then((querySnapshot) => {
querySnapshot.forEach((doc) => {
console.log(doc.id, " => ", doc.data());
return (
<div className={style.card}>
<Task todo={doc} />
</div>
);
});
})
: null}
</>
);
};
export default Tasks;
附上错误的快照here
你还没有从 react
导入useContext
钩子
试试这个
import React, { useEffect, useState, useContext } from "react";
import { auth } from "../services/firebase";
export const AuthContext = React.createContext();
export const AuthProvider = (props) => {
const [loading, setLoading] = useState(true);
const [currentUser, setCurrentUser] = useState(null);
useEffect(() => {
auth.onAuthStateChanged((user) => {
setCurrentUser(user);
setLoading(false);
});
}, []);
if (loading) {
return <p>Loading...</p>;
}
// console.log(children);
return (
<AuthContext.Provider value={{ currentUser }}>
{props.children}
</AuthContext.Provider>
);
};
您的渲染方法(下面附上的部分)不会等到 .then
被触发。相反,它将 return 和 Promise
保持原样。因此你提到的Error: Objects are not valid as a React child (found: [object Promise])
。
{
true
? db
.collection("Users")
.doc(`${user.email}`)
.collection("tasks")
.get()
.then((querySnapshot) => {
querySnapshot.forEach((doc) => {
console.log(doc.id, " => ", doc.data());
return (
<div className={style.card}>
<Task todo={doc} />
</div>
);
});
})
: null
}
由于这是一个异步操作,所以这部分最好使用状态。例如,您可以在组件安装时获取数据(使用 useEffect
),将所有内容放入状态(使用 useState
),然后呈现状态。
import React, { useEffect, useState } from "react";
import { db } from "../services/firebase";
import style from "./css/dashboard.module.css";
import InputTask from "./InputTask";
import Task from "./Task";
const Tasks = ({ user }) => {
const [tasks, setTasks] = useState([]);
// fetching data again when user changes
useEffect(() => {
db
.collection("Users")
.doc(`${user.email}`)
.collection("tasks")
.get()
.then((querySnapshot) => {
setTasks(querySnapshot);
})
}, [user]);
return (
<>
<div className={style.card}>
<InputTask user={user} />
</div>
{tasks.length
? tasks.map((task) =>
<div className={style.card}>
<Task todo={task} />
</div>
)
: null}
</>
);
};
export default Tasks;