我很反应原生,我正在尝试动态更新列表。
以下是我的代码:
import React, { Component } from "react";
import { View, Text, StyleSheet, FlatList } from "react-native";
import { Tile, ListItem, List } from "react-native-elements";
export default class JoinSession extends Component {
constructor() {
super();
this.state = {
dataToRender: [{ "id": "0", "name": "name0", "des": "des0" }]
}
}
componentDidMount() {
var counter = 0;
const interval = setInterval(() => {
try {
var temp = {
"id": ++counter + "",
"name": "name" + counter,
"des": "des" + counter
}
let tempArray = this.state.dataToRender;
tempArray.push(temp);
this.setState({
dataToRender: tempArray
});
console.log(this.state.dataToRender);
if(counter === 10) {
clearInterval(interval);
}
} catch (e) {
console.log(e.message);
}
}, 2000);
}
renderList(item) {
console.log(item);
return (
<ListItem
roundAvatar
title={item.name}
subtitle={item.des}
/>
);
}
render() {
return (
<View style={{ flex: 1, alignItems: "stretch", backgroundColor: "skyblue" }}>
<List>
<FlatList
data={this.state.dataToRender}
renderItem={({ item }) => this.renderList(item)}
keyExtractor={item => item.id}
/>
</List>
</View>
);
}
}
我只能获得我在构造函数中声明的第一个元素,但是我在serInterval中附加的数据没有显示在页面上。
请帮我解决,或者如果有其他办法,请告诉我。
提前致谢。
答案 0 :(得分:4)
您可以尝试查看可在FlatList上使用的extraData参数:
通过将extraData={this.state}
传递给FlatList,我们确保当state.selected更改时,FlatList本身将重新呈现。如果没有设置这个道具,FlatList就不会知道它需要重新渲染任何项目,因为它也是一个PureComponent,道具比较不会显示任何变化。
<FlatList
...
extraData={this.state}
/>
有关FlatList文档的更多信息:https://facebook.github.io/react-native/docs/flatlist.html
此外,您不应该在本地元素中使用此<List>
,此列表行为完全由您的FlatList处理。
答案 1 :(得分:1)
就像@AlexDG一样,平面列表是Pure组件。要更新纯组件,请使用关键道具。
但是不要过度使用它,否则您可能会得到不必要的重画。
<FlatList
key={this.state.dataToRender.length} <---------- rerender
data={this.state.dataToRender}
renderItem={({ item }) => this.renderList(item)}
keyExtractor={item => item.id}
/>
答案 2 :(得分:0)
我自己拥有这个,碰巧被OP读this comment:
问题是阵列突变。切勿在响应本机中更改数组或对象。
我确实是这样改变我的状态的:
this.setState(prev =>
prev.listData.push("stuff");
return prev;
});
您也可以在问题中看到它:
let tempArray = this.state.dataToRender;
tempArray.push(temp);
更改为
this.setState(prev => {
let copy = Array.from(prev.listData);
copy.push("stuff");
return {listData: copy};
});
但是,我的列表正在更新中!
因此,如果您要更改状态中与列表的data
相关的数组,则可能想看看这是否对某些人有帮助。