我正在使用React Native和Firebase实时数据库。我遇到了FlatList
组件的两个问题:
我收到很多重复的密钥"列表重新呈现时出现错误。我不确定为什么我会遇到此问题,因为我将列表中每个项目的键设置为Firebase生成的snap.key
值,这是唯一的(我已在我的日志中验证了这一点)。
即使我向上或向下滚动列表,列表有时也不会重新渲染。这个"有时"行为让我失望,我无法调试它。我正在使用" .on"从Firebase实时数据库获取列表的方法。
这是我正在使用的代码:
export default class FlatListPage extends React.PureComponent {
constructor(props) {
super(props);
this.state = {
data: [],
};
}
makeRemoteRequest = () => {
var items = [];
DB.on('value', (snap) => {
this.getItems(snap, items);
items = items.reverse();
this.setState(
{data: items}
);
console.log(this.state.data); //checking key properties are unique
});
}
getItems = (snap, items) => {
snap.forEach((child) => {
items.push({
key: child.key,
status: child.val().status,
location: child.val().location,
});
});
}
componentWillMount(){
this.makeRemoteRequest();
}
render() {
return (
<View>
<FlatList
data={this.state.data}
renderItem={({item}) => <MyListItem item={item} />}
/>
</View>
);
}
}
答案 0 :(得分:1)
您正在接收重复密钥,因为您在从firebase收到新的items
事件时未重置value
数组。这意味着您只需重复添加相同的项目。
每次收到makeRemoteRequest
事件时,请更新value
方法重新创建数组,如下所示:
makeRemoteRequest = () => {
DB.on('value', (snap) => {
var items = [];
this.getItems(snap, items);
items = items.reverse();
this.setState(
{data: items}
);
console.log(this.state.data); //checking key properties are unique
});
}
我不确定2号 - 可能是因为上述内容将其视为副作用。
答案 1 :(得分:0)