Javascript 反应本机错误:只能更新已安装或正在安装的组件
我有一个RN应用程序,当一个组件挂载时,我从Firebase读取数据(一个“收藏夹”屏幕),并将其设置为Favorites组件的状态,然后进行渲染 但是当我在另一个屏幕上向firebase中的收藏夹数据库添加项目时,我会收到一条黄色警告: 警告:只能更新已安装或正在安装的组件。这通常意味着您在未安装的组件上调用setState、replaceState或forceUpdate 当我添加一个新项目,然后更新Javascript 反应本机错误:只能更新已安装或正在安装的组件,javascript,reactjs,firebase,react-native,Javascript,Reactjs,Firebase,React Native,我有一个RN应用程序,当一个组件挂载时,我从Firebase读取数据(一个“收藏夹”屏幕),并将其设置为Favorites组件的状态,然后进行渲染 但是当我在另一个屏幕上向firebase中的收藏夹数据库添加项目时,我会收到一条黄色警告: 警告:只能更新已安装或正在安装的组件。这通常意味着您在未安装的组件上调用setState、replaceState或forceUpdate 当我添加一个新项目,然后更新firebase.database().ref('userfavs').child(Devi
firebase.database().ref('userfavs').child(DeviceID)
中的数据时,会弹出这个窗口。要明确的是,功能似乎没有中断,当我从状态中注销datalist
数组时,新的“favorited”项将按预期添加到该数组中
class Favorites extends React.Component {
constructor(props) {
super(props);
this.state = {
datalist: []
};
this.favsRef = firebase.database().ref('userfavs').child(DeviceID);
}
listenForItems(favsRef) {
favsRef.on('value', (snap) => {
var items = [];
snap.forEach((child) => {
items.push(child.val()
);
});
});
this.setState({
datalist: items
});
});
}
componentWillMount() {
this.listenForItems(this.favsRef);
}
render() {
console.log('state datalist:', this.state.datalist);
... }}
我真的不理解这个错误,因为我已经将listenForItems
调用放在componentWillMount
下,所以每当我导航到“收藏夹”屏幕并加载此组件时,它都会下拉Firebase中的最新数据
谢谢 您可能正在添加一个侦听器,以便在卸载收藏夹组件后将其保存在内存中 根据文档,有一种分离侦听器的
.off
方法:
解决方案如下:
class Favorites extends React.Component {
constructor(props) {
super(props);
this.state = {
datalist: []
}
this.favsRef = firebase.database().ref('userfavs').child(DeviceID);
this.listen = snap => {
const dataItems = snap.map(child => child.val())
this.setState({dataItems})
}
}
componentDidMount() { this.favsRef.on('value', this.listen) }
componentWillUnmount() { this.favsRef.off('value', this.listen) }
你试过componentdidmount吗?@eosterberg是的!componentdidmount和componentwillmount都存在错误。然后我猜您的收藏夹组件已卸载,我建议在设置状态之前检查您的组件是否已装载,但在我向firebase数据库添加项目时,我没有设置
收藏夹组件的状态。。。.setState
仅在我调用listenformes
时才会调用,因为当我重新打开收藏夹屏幕时,componentWillMount
会被触发,否?是的,但我想收藏夹组件会保留在内存中,即使它已卸载hey@eosterberg--在代码行中复制,我运行它时出错,snap.map不是函数。(在'snap.map(function(child){return child.val();}')中,'snap.map'不是一个函数
。好的,我只是伪编码,然后您必须使用forEach循环