реагирует на виртуализацию: столбец таблицы с CellMeasurer всегда имеет высоту кэша - PullRequest
0 голосов
/ 06 июня 2019

Я пытался следовать примеру DynamicHeightTableColumn и адаптировать его для своего варианта использования.В демонстрации CellMeasurer я вижу, что однострочные строки имеют высоту по умолчанию, определенную при инициализации кэша.Однако в моем случае кажется, что строки из одной строки всегда имеют самую высокую высоту строки, хранящуюся в кэше, а не по умолчанию.

Вот мой код:

import * as React from 'react';
import * as Immutable from 'immutable';
import { Table, Column, AutoSizer, CellMeasurer, CellMeasurerCache } from 'react-virtualized';

interface Props {
    logs: Immutable.List<Immutable.Map<string, any>>;
    columns: (
        width: number
    ) => Array<{
        name: string;
        key: string;
        width: number;
        variableHeight?: boolean;
    }>;
}

export default class LogTable extends React.Component<Props, {}> {
    private cache: CellMeasurerCache;

    constructor(props) {
        super(props);

        this.cache = new CellMeasurerCache({
            defaultHeight: 20,
            fixedWidth: true,
            keyMapper: () => 1
        });
    }

    render() {
        const { logs } = this.props;

        return (
            <AutoSizer disableHeight>
                {({ width }) => (
                    <Table
                        headerHeight={20}
                        height={250}
                        rowCount={logs.size}
                        rowHeight={this.cache.rowHeight}
                        width={width}
                        overscanRowCount={2}
                        rowRenderer={this.rowRenderer}
                        headerClassName='col-header'
                        gridClassName='log-table-grid'
                        rowClassName='log-table-row'
                        className='log-table'
                        rowGetter={({ index }) => logs.get(index)}
                        deferredMeasurementCache={this.cache}>
                        {this.renderColumns(width)}
                    </Table>
                )}
            </AutoSizer>
        );
    }

    private renderColumns(width) {
        return this.props.columns(width).map(({ name, key, width, variableHeight }, idx) => {
            const props: any = {
                label: name,
                dataKey: key,
                width,
                key,
                className: 'column'
            };
            if (variableHeight) {
                props.cellRenderer = this.cellRenderer.bind(this, idx);
            }

            return <Column {...props} />;
        });
    }

    private rowRenderer(params) {
        const { key, className, columns, rowData, style } = params;

        if (!rowData) {
            return null;
        }

        return (
            <div className={className} key={key} style={style}>
                {columns}
            </div>
        );
    }

    private cellRenderer(colIndex, { dataKey, parent, rowIndex }) {
        const content = this.props.logs.get(rowIndex).get(dataKey);

        return (
            <CellMeasurer
                cache={this.cache}
                columnIndex={colIndex}
                key={dataKey}
                parent={parent}
                rowIndex={rowIndex}>
                <div style={{ whiteSpace: 'normal' }} title={content}>
                    {content}
                </div>
            </CellMeasurer>
        );
    }
}

И это вывод (см. 2-ую строку в таблице, которая слишком высока для своего содержания)не думаю, что может вызвать такое поведение

.log-table {
    font-size: 14px;

    .col-header {
        font-size: 15px;
        text-align: center;
    }

    .log-table-grid {
        outline: none;
        font-family: monospace;
    }

    .log-table-row {
        border-bottom: 1px solid gray;
        padding: 3px;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...