我正在将Firebase用于数据库,将Ionic + React用于移动应用程序。我已经将Firebase数据转换为数组,但是当我想映射值时。它告诉我它应该具有唯一键,但是我已经在元素的return函数中放置了唯一键。有人可以告诉我我做错了什么吗?谢谢。
这是我将对象转换为数组的代码
const Tab2: React.FC = () => {
const [doctors, setDoctor] = React.useState([]);
useIonViewWillEnter(()=>{
console.log('Enter')
firebase.database().ref('users').orderByChild('type').equalTo('doctor').on('value',(snapshot)=>{
setDoctor(Object.keys(snapshot.val()).map(key => ({ [key]: snapshot.val()[key] })))
})
console.log(doctors)
})
还有我的回报
<IonList>
{doctors.map(elem => {
return(
<IonItem key={elem['uid']}>
<IonLabel>
<IonText className="font-weight: bold;">
<h3>{elem['name']}</h3>
</IonText>
<h4>{elem['speciality']}</h4>
<h4>{elem['email']}</h4>
</IonLabel>
<br></br>
</IonItem>
)
})}
</IonList>
我得到的是Warning: Each child in a list should have a unique "key" prop.
我的Firebase结构
更新:console.log(doctors)
仅会输出一个像[]
这样的空数组,我不知道为什么。在组件输入之前,我已经将其放入方法中。
答案 0 :(得分:1)
注意:那只是一个警告,而不是错误。
这是正确的方法。
<IonList>
{doctors.map((elem, index) => {
// index has to come from the second parameter from map
return (
<IonItem key={index}>
<IonLabel>
<IonText className="font-weight: bold;">
<h3>{elem["name"]}</h3>
</IonText>
<h4>{elem["speciality"]}</h4>
<h4>{elem["email"]}</h4>
</IonLabel>
<br></br>
</IonItem>
);
})}
</IonList>;
索引必须放在第一个/父div元素中。在这种情况下,它将是<IonItem>
ref:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
同样,您也没有得到数据。像这样调整您的代码。您只需创建一个新的arr,然后遍历快照即可获取密钥。
将具有相应键的对象推到新的arr,因此无需特定键名(例如 eA9w5ynhqN9iT7kKDBt2Ane9VF3
)即可进行迭代useIonViewWillEnter(() => {
console.log("Enter");
let newArr = [];
firebase
.database()
.ref("users")
.orderByChild("type")
.equalTo("doctor")
.on("value", (snapshot) => {
let key;
snapshot.forEach((childSnap) => {
key = childSnap.key; // im just getting the key
const snapVal = snapshot.val(); // getting the object
newArr.push(snapVal[key]);
});
setDoctor(newArr);
// console.log(doctors)
});
});
答案 1 :(得分:0)
尝试将key
道具添加到每个孩子以及孩子中的每个元素,它将起作用。
您的代码应如下所示:
<IonList>
{doctors.map(elem => {
return(
<IonItem key={elem['uid']}>
<IonLabel key={"lbl-" + elem['uid']}>
<IonText key={"txt-"+elem['uid']}className="font-weight: bold;">
<h3 key={"name-"+elem['uid']}>{elem['name']}</h3>
</IonText>
<h4 key={"speciality-"+elem['uid']}>{elem['speciality']}</h4>
<h4 key={"email-"+elem['uid']}>{elem['email']}</h4>
</IonLabel>
<br></br>
</IonItem>
)
})}
</IonList>
如果您发现我在密钥之前添加了lbl-,txt-,以避免再次出现警告: “警告:flattenChildren(...):遇到两个具有相同密钥的孩子,