React Native — как оптимизировать рендеринг элемента FlatList или выполнить неглубокое сравнение с ExtraData?

#reactjs #react-native

#reactjs #реагировать-родной

Вопрос:

Я усердно работаю над оптимизацией своего <FlatList /> компонента, вот мои примеры кодов:


Случай 1:

https://snack.expo.io/HrpJli9EE

Я пытаюсь увеличить количество идентификаторов в selectedIds .
Однако, поскольку контекст selectedIds in не изменяет ссылку
и <FlatList /> выполняет неглубокое сравнение,
поэтому элементы не были повторно отображены со значением в контексте.


Случай 2:

https://snack.expo.io/wRLNRYAmU

Поэтому я пытаюсь создавать новую ссылку на объект каждый раз, когда элемент нажат
(только измените строку 17 из ссылки Case 1)
Теперь элементы могут повторно отображаться с новыми значениями.
Однако компонент memo() не работает для <Item /> компонента,
что может привести к большой загрузке для большого списка.


Итак…

Случай 1: есть ли какой-нибудь способ <FlatList /> не проводить неглубокое сравнение с extraData ?

Или…

Случай 2: Есть ли какой-либо способ предотвратить повторный рендеринг в <Item /> компоненте, если значение элемента одинаковое?

т.е. если я нажимаю на первый элемент, чтобы увеличить номер,
так как номер второго элемента и третьего элемента не увеличивается, они не должны повторно отображаться
но в настоящее время они повторно визуализируются.

Цените любые ответы или комментарии.


Напоминание: Вы можете открыть панель консоли, нажав «Редактор» в нижней панели> включить «Панель»> нажать «ЖУРНАЛ».

Ответ №1:

Выяснил, используя case 2 с useMemo помощью instead of memo может уменьшить ненужный рендеринг неизмененного элемента:

 import React, { useContext, useMemo } from 'react';
import { Text, TouchableOpacity } from 'react-native';

import { styles } from './styles';

const Item = ({ item, onPress }) => {
  const { selectedIds } = useContext(AppContext);
  const value = selectedIds[item.id] || 0;
  const onItemPress = () => onPress(item.id, value   1);

  return useMemo(() => {
    /* You will only see this console log when this item value is updated */
    console.log("render item", item.id, value);
    return (
      <TouchableOpacity onPress={onItemPress} style={styles.item}>
        <Text style={styles.title}>{item.title} {value}</Text>
      </TouchableOpacity>
    );
  }, [value]);
};