在我的React Native iOS应用程序中,可以同时安装多个组件实例。
想想Instagram - 当用户在Instagram中点击照片然后点击照片所有者的头像时,用户场景就会从右侧推进。
如果她继续点击用户照片列表中的相同照片,第一个场景的克隆也将从右侧推进。
我需要安装场景的所有实例,建立Firebase侦听器,获取初始数据的快照并在此之后监听更改。
一切都适用于第一个组件实例。
但是,在任何后续实例中,都会定义侦听器,但是它们的回调不会立即执行,因此组件不会收到快照。
值得注意的是,当数据发生变化时,两个听众执行执行回调。
constructor(props) {
super(props);
const { uid } = props;
// Set firebase refs
this.postsRef = firebase.database().ref('posts');
this.hostsRef = firebase.database()
.ref(`users/${uid}/host`)
.orderByChild('startTime');
this.hostedPostRefs = {};
// Keep a raw copy of the hosts
this.hostedPosts = {};
// ListView DataSource instance
this.hostedPostsDataSource = new ListView.DataSource({
rowHasChanged: (r1, r2) => r1._key !== r2._key,
});
// Initial State
this.state = {
loading: true,
hostedPostsDataSource: this.hostedPostsDataSource.cloneWithRows(this.hostedPosts),
};
}
componentDidMount() {
this.hostsRef.on('value', this._onHostsReceived)
}
componentWillUnmount() {
this.hostsRef.off();
forEach(this.hostedPostRefs, hostedPostRef => {
hostedPostRef.off()
})
}
_onHostsReceived = (snapshot) => {
snapshot.forEach(this._requestPost)
};
_requestPost = (snapshot) => {
const { key } = snapshot;
if (!this.hostedPostRefs[key]) {
this.hostedPostRefs[key] = this.postsRef.child(key);
this.hostedPostRefs[key].on('child_changed event', this._onPostReceived)
}
};
_onPostReceived = (snapshot) => {
this.hostedPosts[snapshot.key] = snapshot.val();
this.setState({
hostedPostsDataSource: this.hostedPostsDataSource.cloneWithRows(this.hostedPosts)
});
};
以下是Firebase docs必须说的内容:
通过将异步侦听器附加到a来检索Firebase数据 firebase.database.Reference。监听器被触发一次 数据的初始状态,并且在数据发生变化的任何时候都会再次出现。
我正在使用React Native Firebase。鉴于此,我不确定这是否是React Native Firebase或Firebase的API中的错误。