Предотвращение повторного отображения общего компонента ListHeaderComponent

#react-native #expo

#react-native #выставка

Вопрос:

Я работаю над приложением для социальных сетей, где у меня есть компонент контейнера, который имеет следующую структуру

 <MyContainer>
   <SelectionBar/>
   {condition? <FlatListA header={header}/> : <FlatListB header={header}/>}
<MyContainer/>
 

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

у этих двух плоских списков разные слушатели и данные, поэтому они должны быть их собственным компонентом, но они используют один и тот же компонент ListHeaderComponent, который является функцией, аналогичной snapchat stories

проблема в том, что когда пользователь переключается между двумя плоскими списками, истории мерцают, потому что компонент повторно отображается из-за двух разных плоских списков

заголовок должен находиться внутри flatlist как ListHeaderComponent, потому что, когда пользователь прокручивает вниз, истории не должны прилипать к началу

есть ли какой-либо способ предотвратить повторный рендеринг?

Я пробовал React.memo, но это не сработало

Ответ №1:

Вы можете предотвратить повторный рендеринг того же компонента с помощью React.memo

Вы можете определить свой header компонент и передать его как prop, например:

 import { memo } from "react";
import FlatListA from "./FlatListA";
import FlatListB from "./FlatListB";

const header = memo((props) => {
  console.log("header render");
  return <h1>this is header</h1>;
});

export default function App() {
  return (
    <div className="App">
      <FlatListA header={header} />
      <FlatListB header={header} />
    </div>
  );
}
 

и вы можете использовать его в своих FlatList компонентах, таких как:

 import { useState } from "react";

export default function FlatListA(props) {
  console.log("flatlista render");

  const [toggle, setToggle] = useState(false);

  return (
    <div>
      <props.header />
      FlatlistA {toggle}
      <button onClick={() => setToggle(!toggle)}>toogle state</button>
    </div>
  );
}
 

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