React Native Flatlist перерисовывает очень медленно

У меня есть список из 250+ продуктов. В первый раз, когда страница загружается, она плавная и быстрая, но когда я применяю фильтр к данным и перерисовываю, Flatlist загружается долго. Я действительно поражен последние 3 дня и не знаю, что делать.

Ссылка: http://gph.is/2FoBbaO

Обратите внимание на время, прошедшее после того, как я нажму на переключатель.

Код: Есть 2 компонента.

Список:

   toggleVeg = (onlyVeg) => {
      this.setState({ showVegLoader: true });
      const categories = this.state.restaurant.categories;
      const allproducts = [];
      if (onlyVeg) {
        for (let i = 0; i < categories.length; i++) {
          for (let j = 0; j < categories[i].products.length; j++) {
            if (categories[i].products[j].is_veg) {
              allproducts.push(categories[i].products[j]);
            }
          }
        }
      } else {
        for (let i = 0; i < categories.length; i++) {
          for (let j = 0; j < categories[i].products.length; j++) {
            allproducts.push(categories[i].products[j]);
          }
        }
      }
      this.setState({ onlyVeg, allproducts, showVegLoader: false });
  }

  renderRow(product, index) {
    return (
      <FoodItem
        key={index}
        color={this.state.color}
        index={index}
        product={product}
        quantity={this.state.products[product.id].quantity}
        // showNonVeg={!this.state.onlyVeg}
        increment={this.increment}
        decrement={this.decrement}
        incrementModal={this.incrementModal}
        decrementModal={this.decrementModal}
      />
    );
  }

  render() {
      <FlatList
            style={{ padding: 0 }}
            data={this.state.allproducts}
            renderItem={({ item, index }) => this.renderRow(item, index)}
            keyExtractor={(item, index) => index}
            extraData={this.state}
            removeClippedSubviews
          />
      );
    }

Компонент FoodItem:

      render() {
    const { index, product, quantity, color } = this.props;
    let image = veg;
    if (product.is_veg !== 1) {
      image = nonveg;
    }
    // let opacity = 1;
    // let height = 'auto';
    // let width = 'auto';
    // if (!showNonVeg && product.is_veg !== 1) {
    //   opacity = 0;
    //   height = 0;
    //   width = 0;
    // }

    return (
      <View key={index}>
        <Row style={{ flex: 1, paddingLeft: 0, paddingRight: 0, paddingBottom: 5 }}>
          <Left
            style={{ flex: 0.08,
              marginTop: 3,
              alignItems: 'flex-start',
              alignSelf: 'flex-start',
              justifyContent: 'flex-start' }}
          >
            <Image
              style={{ width: 16, height: 16 }}
              source={image}
            />
          </Left>
          <Body
            style={{ flex: 0.62 }}
          >
            <Row
              style={{ flex: 1,
                padding: 0,
                alignSelf: 'flex-start',
                alignItems: 'center' }}
            >
              <Subtitle
                style={{ fontSize: 14,
                  fontFamily: 'Montserrat',
                  color: 'rgba(0,0,0,0.8)',
                  fontWeight: '500' }}
              >
                {product.name}
              </Subtitle>
            </Row>
            <Row
              style={{ flex: 1,
                padding: 0,
                alignSelf: 'flex-start',
                alignItems: 'center' }}
            >
              <Caption>
                {constants.CURRENCY} {product.variants[0].price.toFixed(2)}
              </Caption>
            </Row>
          </Body>
          <Right style={{ flex: 0.3 }}>
            {uiQuantity}
          </Right>
        </Row>
        <Subtitle
          style={{ paddingLeft: 25,
            fontFamily: 'Montserrat',
            color: 'rgba(0,0,0,0.4)',
            fontWeight: '400',
            fontSize: 12
          }}
        >
          {product.description}
        </Subtitle>
      </View>
    );
  }

P.S. удалил некоторый код, который не имел значения.


person Naman Khator    schedule 11.01.2018    source источник
comment
является FoodItem чистым компонентом   -  person wizloc    schedule 15.01.2018
comment
Да. класс экспорта по умолчанию FoodItem расширяет React.PureComponent   -  person Naman Khator    schedule 16.01.2018
comment
так эта проблема до сих пор не решена? сейчас 21 января, прошло 10 дней   -  person NamNamNam    schedule 21.01.2018
comment
Пока не нашел решения. Хотя я использовал другой список: github.com/Flipkart/recyclerlistview Кажется, это достаточно быстро. Все еще реализую, опубликую решение, если оно достаточно хорошее.   -  person Naman Khator    schedule 23.01.2018
comment
Возможный дубликат реагировать на 100+ элементов плоского списка очень медленно   -  person I Putu Yoga Permana    schedule 08.06.2019


Ответы (1)


1) Достаточно ли быстро работает функция toggleVeg? (может проблема в нем)

2) У вас есть id для продуктов? Если да, используйте их в keyExtractor={(item) => item.id}, чтобы избежать повторного рендеринга одних и тех же товаров.

person Oleksandr Cherniavenko    schedule 11.01.2018
comment
1) для возврата toggleVeg требуется 3 миллисекунды. 2) Да. Делал это еще же время. :( - person Naman Khator; 11.01.2018