react-native - 如何在 react-native 功能组件中呈现从 firebase 数据库中提取的数据
问题描述
我正在从控制台中的 firebase 数据库中获取数据,如下所示。[{ "isDonor": true, "name": "Nadi", "photo": "https://gre", "uid": "2ZE" }, { "email": "mmaz", "isDonor": true, "name": "Mz", "photo": "https://gra", "uid": "Cb" }]
我想为每个对象创建卡片,但是如何在一段时间后获取数据时做到这一点?我想这样渲染
我检查了其他答案,但它们主要来自类组件。我尝试过使用useEffect
钩子但无法实现这是我的代码
import * as React from 'react';
import {Text, View, StyleSheet, Image} from 'react-native';
import database from '@react-native-firebase/database';
const donorsData = [];
database()
.ref('users')
.orderByChild('isDonor')
.equalTo(true)
.once('value')
.then((results) => {
results.forEach((snapshot) => {
// console.log(snapshot.key, snapshot.val());
// console.log(snapshot.val());
donorsData.push(snapshot.val());
});
// console.log('aft', donorsData);
});
export default function New() {
return (
<View style={styles.container}>
{donorsData.map((v, i) => {
return (
<View
key={v.uid}
style={{
backgroundColor: 'white',
padding: 10,
margin: 5,
borderRadius: 10,
}}>
<Text>{v.name}</Text>
<Text>{v.email}</Text>
<Image source={{uri: v.photo}} style={{height: 150, flex: 1}} />
</View>
);
})}
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#ecf0f1',
padding: 8,
backgroundColor: 'lightblue',
},
});
解决方案
import React, { useState, useEffect } from "react";
import { Text, View, StyleSheet, Image } from "react-native";
import database from "@react-native-firebase/database";
export default function New() {
const [data, setData] = useState([]);
useEffect(() => {
const donorsData = [];
database()
.ref("users")
.orderByChild("isDonor")
.equalTo(true)
.once("value")
.then((results) => {
results.forEach((snapshot) => {
donorsData.push(snapshot.val());
});
setData(donorsData);
});
}, []);
return (
<View style={styles.container}>
{data?.map((v, i) => {
return (
<View
key={v.uid}
style={{
backgroundColor: "white",
padding: 10,
margin: 5,
borderRadius: 10,
}}
>
<Text>{v.name}</Text>
<Text>{v.email}</Text>
{ v.photo && <Image source={{ uri: v.photo }} style={{ height: 150, flex: 1 }} />}
</View>
);
})}
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: "#ecf0f1",
padding: 8,
backgroundColor: "lightblue",
},
});
推荐阅读
- typescript - 品牌类型的交集
- javascript - 通过命令添加和删除 Discord 角色
- java - 错误:尝试运行 android studio 项目时找不到符号
- c# - Unity - 使用 foreach 循环以及父对象和子对象进行 Lerp 旋转?
- biopython - 在两个 gb 文件中搜索匹配的序列
- swiftui - 你能像 ToolbarContent 的命名块一样使用闭包吗 - ToolbarItem
- javascript - 禁止语句不删除消息并禁止用户
- asp.net-mvc - 如何将此 .net 代码转换为 .net 核心代码
- java - 为什么 println() 函数在这种情况下表现不同?
- git - 在 $git push -u origin main 命令之后,Git bash 没有请求任何身份验证,实际上什么都不做