为什么FlatList没有在React Native中动态更新

时间:2018-05-31 09:45:08

标签: javascript react-native react-native-flatlist

我很反应原生,我正在尝试动态更新列表。

以下是我的代码:

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中附加的数据没有显示在页面上。

请帮我解决,或者如果有其他办法,请告诉我。

提前致谢。

3 个答案:

答案 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相关的数组,则可能想看看这是否对某些人有帮助。