在反应中从 firebase 发出迭代状态
Issue iterating state from firebase in react
我在反应中有这个组件,它从 firebase 获取待办事项,构建一个数组并设置一个状态,但是当我渲染该组件时,我第一次只能看到元素,如果我重新加载页面,状态似乎是空的。
import React, { PureComponent } from 'react';
import firebase from 'firebase'
class Charts extends PureComponent {
constructor(props) {
super(props);
this.state = { data: [] };
this.todoRef = firebase.database().ref('Todo');
}
componentDidMount = () => {
var data = [];
this.todoRef.on('value', (snapshot) => {
const todos = snapshot.val();
for (let id in todos) {
data.push({ id, ...todos[id] });
}
});
this.setState({ data: data })
}
render() {
return <div>
{this.state.data.map(item => (
<p>{item.name}</p>
))}
</div>
}
}
export default Charts;
如果我使用控制台日志,我会得到一个包含元素的数组 (0)。我试过在不同的 life cicles 方法中定位 setState,但似乎不起作用。
问题
您正在调用 this.setState
外部 快照处理程序,因此您只传递空的 ([]
) data
数组到状态更新器。
解决方案
您应该将状态更新移动到处理快照的函数中。
componentDidMount = () => {
const data = [];
this.todoRef.on('value', (snapshot) => {
const todos = snapshot.val();
for (let id in todos) {
data.push({ id, ...todos[id] });
}
this.setState({ data });
});
}
我在反应中有这个组件,它从 firebase 获取待办事项,构建一个数组并设置一个状态,但是当我渲染该组件时,我第一次只能看到元素,如果我重新加载页面,状态似乎是空的。
import React, { PureComponent } from 'react';
import firebase from 'firebase'
class Charts extends PureComponent {
constructor(props) {
super(props);
this.state = { data: [] };
this.todoRef = firebase.database().ref('Todo');
}
componentDidMount = () => {
var data = [];
this.todoRef.on('value', (snapshot) => {
const todos = snapshot.val();
for (let id in todos) {
data.push({ id, ...todos[id] });
}
});
this.setState({ data: data })
}
render() {
return <div>
{this.state.data.map(item => (
<p>{item.name}</p>
))}
</div>
}
}
export default Charts;
如果我使用控制台日志,我会得到一个包含元素的数组 (0)。我试过在不同的 life cicles 方法中定位 setState,但似乎不起作用。
问题
您正在调用 this.setState
外部 快照处理程序,因此您只传递空的 ([]
) data
数组到状态更新器。
解决方案
您应该将状态更新移动到处理快照的函数中。
componentDidMount = () => {
const data = [];
this.todoRef.on('value', (snapshot) => {
const todos = snapshot.val();
for (let id in todos) {
data.push({ id, ...todos[id] });
}
this.setState({ data });
});
}