javascript - 反应JS。火力基地。TypeError:无法读取未定义的属性“setState”
问题描述
下面是一个在提交名称时调用的函数。它进入firebase db,然后我们可以通过查看db来查看谁连接了。
但是,当我将这些数据提取到对象(用户)数组中时,我就卡住了。我正在尝试将此数据推送到 this.state.names (在构造函数状态中声明的数组),但我无法理解它。
错误消息指向代码底部的函数。该功能是否应该移动?为什么它不起作用?我读过很多关于“这个”的帖子,但我很挣扎。
setName = e => {
e.preventDefault()
let name = this.state.name;
let connectedRef = firebase.database().ref('.info/connected');
connectedRef.on('value', (snapshot) =>{
if (snapshot.val() === true) {
// Connected
const con = listRef.child(name);
con.onDisconnect().remove();
con.set(true); //Write data (true)
}
listRef.on("value", (snapshot) => {
let users = [];
snapshot.forEach( (user) => {
users.push({
id: snapshot.key,
name: snapshot.val()
})
});
setList(users);
});
function setList(users) {
this.setState({
names: users
})
}
});
}
任何想法我做错了什么?
解决方案
普通函数有自己的上下文。为了能够this
从上层接收正确,您需要将您的setList
功能修改为箭头功能。像这样:
const setList = (users) => {
this.setState({
names: users
})
}
并且不要忘记抬起它,声明应该在使用之前,因为const
变量不会提升。
推荐阅读
- android - 本机脚本轮播:无法按索引找到 Carousel(Grid) 子项
- python - Twitter webscraping空列表Python
- php - 删除记录后未找到 Livewire 分页返回 404
- javascript - 运行 2 个 Google Apps 脚本
- apache-flink - TTL 清理 RocksDB 列表状态时,Flink 应用程序失败
- javascript - Leaflet JS中条形图的控制层
- java - 如何从空手道中的 TestRunner 类更新 scneraio 名称
- java - 如何将 NetBeans 上的 MySQL 数据库用于 Java 程序?
- windows - Go exec.Command 管道输出到另一个 powershell
- d3.js - 为什么鼠标悬停事件不适用于 d3.js 投影中的所有状态?