Reactjs React仅呈现从firebase下载的列表中的一项
我正试图显示一个用户列表,我从Firebase实时数据库获得。在日志上,我把它们都记下来了!但是在屏幕上,只有第一个出现。如果我作为依赖项Reactjs React仅呈现从firebase下载的列表中的一项,reactjs,typescript,firebase,firebase-realtime-database,Reactjs,Typescript,Firebase,Firebase Realtime Database,我正试图显示一个用户列表,我从Firebase实时数据库获得。在日志上,我把它们都记下来了!但是在屏幕上,只有第一个出现。如果我作为依赖项users放置,我会在日志上得到一个无限循环,但屏幕上仍然有一个项目使用回调也没有帮助。如果我在屏幕上填写输入,从而触发重新渲染,那么我将获得所有用户。为什么一开始就不能把他们都吸引过来?可能是打字脚本吗 谢谢 。。。 const[users,setUsers]=useState([]); const[usersRef]=useState(firebase.d
users
放置,我会在日志上得到一个无限循环,但屏幕上仍然有一个项目<代码>使用回调也没有帮助。如果我在屏幕上填写输入,从而触发重新渲染,那么我将获得所有用户。为什么一开始就不能把他们都吸引过来?可能是打字脚本吗
谢谢
。。。
const[users,setUsers]=useState([]);
const[usersRef]=useState(firebase.database().ref().child('users');
...
const getUsers:()=>void=useCallback(()=>{
常量加载用户:任意[]=[]
usersRef.on('child_added',(snap:any)=>{
loadedUsers.push(snap.val())
设置用户(加载用户)
log('loadedUsers',loadedUsers);
})
},[setUsers,usersRef])
useffect(()=>{
getUsers();
return()=>usersRef.off()
},[usersRef,getUsers])
const displayUsers=(用户:任意)=>{
console.log(用户);
返回users.length>0&&users.map((用户:任意)=>
{user.email}
)
}
...
{displayUsers(用户)}
所以,多亏了@Renaud Tarnec,firebase侦听器出现了问题。我不得不听value
change而不是child\u added
。以下是新版本。我真的不喜欢displayUsers
原来的方式,但它确实有效。如果有任何建议,我很乐意看到
再次感谢
const getUsers:()=>void=useCallback(()=>{
常量加载用户:任意[]=[]
usersRef.on('value',(snap:any)=>{
loadedUsers.push(snap.val())
设置用户(加载用户)
log('loadedUsers',loadedUsers);
})
},[setUsers,usersRef])
...
const displayUsers=(用户:任意)=>{
console.log(用户);
返回users.length>0&&users.map((userObj:any)=>{
常量用户=[]
for(userObj中的常量键){
users.push(userObj[key])
}
返回users.map((用户:任意)=>
{user.email}
)
}
)
}
如果我正确理解了您的问题,这是因为您使用了添加的子事件而不是值。请参见以下内容中两者之间的差异:
价值事件
此事件将触发一次,初始数据存储在此位置
位置,然后在每次数据更改时再次触发。这个
传递到回调的DataSnapshot将用于
调用了()上的on
子项添加事件
此时,每个初始子级将触发一次此事件
位置,并将在每次创建新的子对象时再次触发
补充。传递到回调中的DataSnapshot将反映数据
对于相关的孩子
总之,通过value
事件,您可以获得此位置的所有数据,而通过添加child\u
事件,您可以获得孩子的数据。谢谢您的时间。我将在上面设置完成的代码。我会在文件里看得更清楚!