警告,VirtualizedList:您的列表很大,更新速度很慢

时间:2018-09-06 09:13:57

标签: reactjs

我的FlatList出现此错误:

VirtualizedList:您的列表很大,更新速度很慢-确保您的renderItem函数呈现遵循React性能最佳实践的组件,例如PureComponent,shouldComponentUpdate等。

我的renderItem是:

renderItem(item) {
    return (
        <View style={[styles.item]}>
            <AgendaItem item={item} />
        </View>
    );
}

我的组件:

import React from "react";
import propTypes from "prop-types";
import { Text, View, WebView } from "react-native";
import { filterString } from "../../helpers";
const AgendaItem = ({
    item: {
        title,
        venue,
        colour,
        organiser,
        startTime,
        endTime,
        description,
        allDay,
        textColor
    }
}) => {
    let descriptionNoHtml = description.replace(/<\/?[^>]+(>|$)/g, "");

    return (
        <View
            style={{
                padding: 10,
                backgroundColor: colour || "white"
            }}
        >
            {title ? (
                <Text style={{ color: textColor || "black" }}>{title}</Text>
            ) : null}
            {description ? (
                <Text style={{ color: textColor || "black" }}>
                    {descriptionNoHtml}
                </Text>
            ) : null}
            {venue ? (
                <Text style={{ color: textColor || "black" }}>{venue}</Text>
            ) : null}
            {organiser ? (
                <Text style={{ color: textColor || "black" }}>{organiser}</Text>
            ) : null}
            {startTime ? (
                <Text style={{ color: textColor || "black" }}>
                    {startTime + " - " + endTime}
                </Text>
            ) : null}
        </View>
    );
};

AgendaItem.propTypes = {
    title: propTypes.string,
    venue: propTypes.string,
    colour: propTypes.string,
    organiser: propTypes.string,
    description: propTypes.string,
    startTime: propTypes.string,
    endTime: propTypes.string,
    allDay: propTypes.string,
    textColor: propTypes.string
};

export default AgendaItem;

如何使用shouldComponentUpdate删除警告?

1 个答案:

答案 0 :(得分:0)

doc提供了呈现垂直长列表时需要考虑的内容:

  

如果您的应用程序呈现了很长的数据列表(数百行或数千行),我们建议使用一种称为“窗口”的技术。该技术在任何给定时间仅呈现一小部分行,并且可以大大减少重新呈现组件所需的时间以及所创建的DOM节点的数量。

这是您需要使用PureComponent或仅应在需要时利用shouldComponentUpdate钩子进行更新的地方。


您正在使用无法使用任何生命周期方法的无状态组件。要使用生命周期方法,您需要使用基于类的全状态组件。

您可以用PureComponent或Component替换无状态组件。如果您使用组件,则可能需要使用shouldComponentUpdate挂钩来通知组件,仅检测到新更改的更新。这是使用PureComponent的示例。

替换:

const AgendaItem = ({
    item: {
        title,
        venue,
        colour,
        organiser,
        startTime,
        endTime,
        description,
        allDay,
        textColor
    }
}) => {

使用:

class AgendaItem extends React.PureComponent {
  const { item: {
            title,
            venue,
            colour,
            organiser,
            startTime,
            endTime,
            description,
            allDay,
            textColor
        }
    } = this.props

在不使用PureComponent的情况下,该组件将在任何组件的每次状态更改时更新。但是使用PureComponent时,只有在检测到新项目时才会更新。

如果您想使用shouldComponentUpdate钩子,请先查看here以供参考。