javascript - React + Firestore:从查询中返回一个变量
问题描述
我目前正在学习 React 和 Firestore,但有点卡住了。我正在尝试通过搜索他们的 uid 从 Firestore 集合中检索用户名。
以下代码在“课程”地图中执行以创建列表。
{lesson.post_author && findName(lesson.post_author)}
下面的代码是 findName 函数。
let findName = uid => {
firebase.firestore().collection("users")
.where('uid', '==', uid)
.get()
.then(querySnapshot => {
console.log(querySnapshot.docs[0].data().name);
});
};
目前,findName 函数将成功将所有名称记录到控制台。我已经更改了代码,以便能够在 firestore 调用之外进行控制台日志,但这会返回一个在控制台中挂起的承诺。
代码的目标是返回名称而不是列表中的 uid。
任何帮助将非常感激。谢谢!
解决方案
正如其他人所解释的那样,您无法返回该值,因为它是从 Firestore 异步加载的。到您return
运行时,数据尚未加载。
在 React 中,您通过将数据置于组件的状态中并从那里使用它来处理此问题。如果您这样做,您的渲染方法可以简单地从状态中获取它,例如:
{lesson.post_author && findName(lesson.post_author_name)}
(以上假设lesson
间接来自国家。
如果我们假装只有一节课,这会更容易一些,并且您在状态中直接拥有这些值:
{state.post_author && findName(state.post_author_name)}
现在我假设你已经有了post_author
,你只需要查找作者的名字。这意味着在某处/之后componentDidMount
您将加载附加数据并将其添加到状态:
componentDidMount() {
firebase.firestore().collection("users")
.where('uid', '==', this.state.uid)
.get()
.then(querySnapshot => {
this.setState({ post_user_name: querySnapshot.docs[0].data().name });
});
}
现在数据的加载仍然是异步发生的,所以调用会在完成setState()
后的某个时间发生componentDidMount
。但是 React 知道改变状态可能需要刷新组件,所以它通过重新setState()
渲染来响应调用。
请注意,我强烈建议使用每个用户的 UID 作为users
. 这样您就不需要查询,只需直接查找即可:
componentDidMount() {
firebase.firestore().collection("users")
.doc(this.state.uid)
.get()
.then(doc => {
this.setState({ post_user_name: doc.data().name });
});
}
推荐阅读
- python - 计算总月累计订单数
- jquery - jQuery 在另一个图标上切换(脉动)一个图标
- javascript - Vue Draggable 移动到上一个列表
- dart - 有没有办法调用 4 个 API,然后创建一个列表并绘制一个饼图
- c# - 如何检查我的双变量是否为整数?
- excel - 无法在 Excel VBA 中迭代函数返回的对象
- django - 如何在模板中调用模型方法
- google-cloud-dataflow - 如何在预定义模板中禁用公共 IP 以启动数据流作业
- php - 是否可以从 html 表单操作中调用 codeigniter 控制器功能
- php - 使用存储过程将值从控制器传递到模型 CodeIginter