优化 FlatList Items 性能的最佳方法

Best method to optimize performance of FlatList Items

这是一个简单的平面列表:

class Products ..
render() {
    return (
          <FlatList
          renderItem={this._renderItem}
           );
}

我想创建一个项目列表并通过 onPress 项目导航到详细信息页面。

请问哪种方法比较好?

方法一:

在子组件(CardProduct 组件)中插入导航到详细信息页面,如下所示:

_renderItem = ({item}) => (

    <CardProduct
      id={item.id}
      title={item.title}
    />
  );

在 CardProduct 组件中:

render() {
    const { id,title } = this.props;

    return (
      <Card style={{flex:1}}>
          <CardItem cardBody button onPress={() => this.props.navigation.navigate('Details',{productId:id})}>
          ...
    );
}

方法二:

在当前组件(Products 组件)中插入导航到详细信息页面,如下所示:

_onPressItem = (id: string) => {
    this.props.navigation.navigate('Details',{productId:id});
};

_renderItem = ({item}) => (

    <CardProduct
      id={item.id}
      title={item.title}
      onPressItem={this._onPressItem}
    />
  );

在 CardProduct 组件中:

_onPress = () => {
    this.props.onPressItem(this.props.id);
};

render() {
    const { id,title } = this.props;

    return (
      <Card style={{flex:1}}>
          <CardItem cardBody button onPress={this._onPress}>
          ...
    );
}

方法1我以前也是这样做的,但是我看了this guide

react-native 平面列表中性能优化的一个步骤是为 renderItem 使用无状态功能组件。并且您应该始终为每个项目提供一个唯一的密钥。

简答:

你应该选择方法2。

解释:

method1 中,您在 CardItem's onPress 中使用箭头函数,因此每次 CardProduct 是 re-rendered onPress 的新引用是创建,这会强制 CardItem 为 re-render,即使所有其他道具都保持不变。在 方法 2 中,您将函数绑定到上下文,这不会强制 re-rendering CardItem

顺便说一下,一般来说,避免在 render() 中使用箭头函数是个好主意。