在InfiniteLoader
内部我有一个List
,其rowRenderer
回调会创建一个由<div>
包裹的CellMeasurer
(我也使用了为此缓存)。行的大小可能会有很大差异,但此设置适用于滚动目的。
但是,每行中的元素可以根据用户输入动态改变高度。在那些情况下,我打电话:
cellMeasurerCache.clear(rowIndex, 0);
this._listRef.recomputeRowHeights(rowIndex);
但在某些情况下,这会导致行跳转 - 这是因为top
值计算错误。例如,我显示的文档包含List
中的以下行:
rowIdx height top
3 668px 420px
4 8547 1088
5 2420 9635
然后行 4 的高度略有增加(~50px)。使用rowIndex == 4
运行上述代码后,我会看到以下行:
rowIdx height top
5 2420px 3088px
6 1156 5508
7 4718 6664
8 1050 11382
如您所见,行 5 现在的top
值不正确,导致行跳转。我假设行 4 的高度无法正确测量。
出了什么问题?
更新2017-11-08:看来,调用cellMeasurerCache.clear(rowIndex, 0)
会将该行的高度替换为estimatedRowSize
的值,这是非常不同的。与文档所说的相反,它似乎没有重新衡量。
CellMeasurer._maybeMeasureCell()
不会调用行 4 。我的rowRenderer
回调(在我的内容周围创建CellMeasurer
)仅从 5 行开始调用。因此,代码已决定使用行 4 显示哪些行的默认高度要小得多,而不是事先计算。
答案 0 :(得分:1)
不确定这是否是正确/最好的方法来解决这个问题,但我能够这样做:
首先,我使用了CellMeasurer
的回调版本,存储了measure
回调供以后使用(每行存储):
rowRenderer = ({ key, index, style, isScrolling, parent }) => {
const getContent = measure => {
// store callback for later use
this._measureCallbacks[index] = measure;
// ... get your content ...
return content;
};
return (
<CellMeasurer
key={key}
cache={cellMeasurerCache}
columnIndex={0}
parent={parent}
rowIndex={index}
>
{({ measure }) => (
<div key={key} style={style}>
{getContent(measure)}
</div>
)}
</CellMeasurer>
);
};
稍后,当行高度发生变化时,我会运行:
,而不是调用cellMeasurerCache.clear()
// tell row to re-measure
this._measureCallbacks[rowIndex]();
// tell list to recompute row offsets
this._listRef.recomputeRowHeights(minRow);