각각의 row에 해당하는 픽셀 높이를 구할 때 사용한다.

만약 지금처럼 동일하게 {50}px을 지정해놓으면, 밑의 사진처럼 height가 50px로 지정되어 버리므로 컨텐츠를 다 나타내지 못할 수 있다. 이 때 사용할 수 있는 방법이 바로 CellMeasurer이다.

Untitled

useRef를 사용해서 CellMeasurerCache 쓰기

효율을 위해서 셀의 크기를 측정한 뒤에 캐시해서 재사용할 수 있다. CellMeasurerCache는 CellMeasurer가 계산한 동적 컨텐츠(row) 높이를 부모와 공유한다.

밑에서는 defaultHeight이 100이므로 평균적인 셀들의 높이가 100px이라는 것이고 width는 고정된 값을 가져야 한다고 명시해준다.

function InfoTable() {
	const cache = useRef(new CellMeasurerCache({
    fixedWidth: true,
    defaultHeight: 100,
  }))  // 변화해도 리렌더링이 일어나지 않는 값
...
return (
	...
	<List
    width={width}
    height={height}
    rowHeight={cache.current.rowHeight}
    deferredMeasurementCache={cache.current}
    rowCount={searchedData.length}
    rowRenderer={rowRenderer}
  />

rowHeight을 cache ref의 current.rowHeight 값으로 두어서 하드코딩하지 않도록 막고, defferedMeasurementCache 속성을 cache ref의 current 값을 가리키게 한다.

CellMeasurer 사용하기

CellMeasurer 컴포넌트로 rowRenderer가 리턴해주는 요소를 감싸준다.

이 때 속성으로 key, cache, parent, columnIndex, rowIndex를 넣는데, 지금 우리의 경우에는 열 별로 데이터를 나타내지는 않으므로 columnIndex는 0의 값을, rowIndex에는 rowRenderer에서 받은 prop index의 값을 넣으면 된다.

function rowRenderer({ key, index, style, parent }) {
    const value = searchedData[index];

    return (
      <CellMeasurer // 추가!
        key={key}
        cache={cache.current}
        parent={parent}
        columnIndex={0}
        rowIndex={index}
      >
        <tr
          class="hover"
          onClick={() => handleTableClick(value)}
          key={key}
          style={style}
        >
         ...
        </tr>
      </CellMeasurer>
    );
  }