Вот модифицированная версия вашей песочницы, которая исправляет это:
Вот ваш первоначальный код в BigList
:
const BigList = props => {
const { height, ...others } = props;
const importantData = Array(101 - 1)
.fill()
.map((_, idx) => 0 + idx);
const rows = ({ index, style }) => (
<FancyListItem
index={index}
styles={style}
text="window'd (virtual): "
{...others}
/>
);
return (
<FixedSizeList
height={height}
itemCount={importantData.length}
itemSize={46}
outerElementType={List}
>
{rows}
</FixedSizeList>
);
};
Я изменил это на следующее:
const Row = ({ data, index, style }) => {
return (
<FancyListItem
index={index}
styles={style}
text="window'd (virtual): "
{...data}
/>
);
};
const BigList = props => {
const { height, ...others } = props;
const importantData = Array(101 - 1)
.fill()
.map((_, idx) => 0 + idx);
return (
<FixedSizeList
height={height}
itemCount={importantData.length}
itemSize={46}
outerElementType={List}
itemData={others}
>
{Row}
</FixedSizeList>
);
};
Важным отличием является то, что Row
теперь является согласованным типом компонента, а не переопределяется при каждом рендеринге BigList
.С вашим исходным кодом каждый рендер BigList
заставлял перемонтировать все элементы FancyListItem
, а не просто перерисовывать, потому что функция вокруг него, представляющая тип "row", была новой функцией с каждым рендерингом BigList
.Одним из следствий этого является то, что элемент привязки, который вы передавали Menu
, больше не был подключен к тому времени, когда Menu
пытался определить его положение, а anchorEl.getBoundingClientRect () предоставлял позицию x, y 0,0.
Вы заметите, что в документации по реагирующему окну (https://react -window.now.sh / # / examples / list / fixed-size ) компонент Row
определен снаружикомпонента Example
аналогично тому, как теперь структурирована фиксированная версия вашего кода.