#reactjs #react-window
Вопрос:
Я не понимаю, почему react-window перерисовывает список для каждого(всех) событий useState, значения которых даже не связаны с самим списком. Не мог бы кто-нибудь объяснить, пожалуйста, как это внутренне связано и как я могу избежать повторной визуализации?
import React, { useState } from "react";
import { FixedSizeList, areEqual } from "react-window";
function App() {
const [count, setCount] = useState(0);
const handleOnClick = () => {
console.log("PUSHED ME");
setCount(count 1) // why does it trigger a re-render of FixedSizeList ?
}
const Row = React.memo(props => {
const { index, style } = props;
return <div style={style}>Row {index}</div>;
}, areEqual);
return (
<div className="App">
<FixedSizeList
height={200}
itemCount={100}
itemSize={50}
width={'100%'}
>
{Row}
</FixedSizeList>
<div onClick={handleOnClick}>Push Me</div>
</div>
);
}
export default App;
Я также попытался использовать второй аргумент react-window AreEqual, но это не помогло. https://react-window.vercel.app/#/api/areEqual
Любые намеки на то, как это можно решить, высоко ценятся! Заранее большое спасибо!
Ответ №1:
Выйдите Row
за пределы App
. Когда компонент повторно отправляет все свои переменные, они объявляются повторно, что означает новые значения, за исключением тех случаев, когда они были сохранены соответствующим крючком, например useMemo
, useCallback
. Вы получаете новое значение для Row
каждого рендеринга.
React.memo
это не крюк для запоминания, это компонент более высокого порядка, который контролирует, когда новые реквизиты должны передаваться указанному компоненту. Он должен быть объявлен вне цикла рендеринга React (как и все компоненты), чтобы правильно функционировать.