2 回答
TA贡献1906条经验 获得超10个赞
我克服了错误。在块内使用函数是错误的。我将 setState 从大括号中移出并且没有该函数。
setName = e => {
e.preventDefault()
this.setState({ [e.target.name]: e.target.value })
let textBox = document.getElementById('inputDivId');
textBox.style.display = "flex";
let messagesBox = document.getElementById('messagesDivId');
messagesBox.style.display = "flex";
let thinkDel = document.getElementById('options');
thinkDel.style.display = "flex";
let nameBox = document.getElementById('nameDivId');
nameBox.style.display = "none";
// Add ourselves to presence list when online.
let name = this.state.name;
// let names = this.state.names;
let connectedRef = firebase.database().ref('.info/connected');
// let users = [];
connectedRef.on('value', function (snap) {
if (snap.val() === true) {
const con = listRef.child(name);
con.onDisconnect().remove();
con.set(true);
}
let users = [];
listRef.on("value", function (snapshot) {
users.push({
id: 1 + Math.random(),
name: snapshot.val()
})
setList(users);
});
function setList(users) {
this.setState({
names: users
})
}
});
}
但是我仍然没有根据需要获取 this.state.names 中的数据!
TA贡献1784条经验 获得超8个赞
数据从 Firebase 异步加载。在加载数据时,主代码继续运行。然后,当数据可用时,您的回调将被调用。
通过放置一些日志语句最容易看到这一点:
console.log("Before attaching listener");
listRef.on("value", function (snapshot) {
console.log("Got data");
});
console.log("After attaching listener");
当您运行此代码时,它会记录:
在附加侦听器之前
附加监听器后
得到数据
这可能不是您所期望的,但这实际上是定义的行为。它还解释了为什么您的代码不起作用:到您调用时,this.setState({ names: users })您的回调尚未运行,并且users是空的。
因此,任何需要数据库数据的代码都必须在回调中,或者从那里调用。在 ReactJS 的情况下,它非常简单:您只需setState从回调中调用:
let users = [];
listRef.on("value", function(snapshot) {
users.push({
id: 1 + Math.random(),
name: snapshot.val()
})
setList(users);
});
function setList(users) {
this.setState({
names: users
})
}
我不完全确定数据结构是什么listRef样的,但怀疑您实际上正在寻找这个:
listRef.on("value", function(snapshot) {
let users = [];
snapshot.forEach(function(user) {
users.push({
id: snapshot.key,
name: snapshot.val()
})
});
setList(users);
});
添加回答
举报