Возможно ли, чтобы список React Virtualized привязывался к полной строке при прокрутке?

У меня есть компонент React Virtualized <List>, который используется как раскрывающееся меню. Я бы хотел, чтобы список прокручивал целую строку за раз, как в обычном меню уровня ОС, или, по крайней мере, привязывался к целой строке, когда прокрутка останавливается.

Я установил scrollToAlignment="top", думая, что это может сработать, но теперь я понял, что это испортило поведение прокрутки при установке scrollToIndex.

Есть событие onScroll, и я полагаю, что я мог бы установить тайм-аут для срабатывания, если другое событие не было получено в определенном окне, а затем заставить scrollTop показывать полную строку. Но я надеялся, что есть более чистый способ сделать это.

Возможное решение

Подобно ответу ниже Брайанвона, я собрал решение, использующее событие onScroll для вызова отклоненной функции, которая привязывает scrollTop к приращение всей строки после небольшой задержки:

const RowHeight = 45;

const ResultsList = React.createClass({
    list: null,

    snapRows: _.debounce(function(scrollTop)
    {
        this.list.scrollToPosition(Math.round(scrollTop / RowHeight) * RowHeight);
    }, 100),

    handleRef: function(ref)
    {
        this.list = ref;
    },

    onScroll: function(event)
    {
        this.snapRows(event.scrollTop);
    },

    rowRenderer: function(data)
    { ... },

    render: function()
    {
        var props = this.props;

        return <List
            ref={this.handleRef}
            width={490}
            height={450}
            rowCount={props.items.length}
            rowHeight={RowHeight}
            rowRenderer={this.rowRenderer}
            scrollToIndex={props.selectedIndex}
            onScroll={this.onScroll}
            {...props}
        />
    }
});

Но я не очень доволен этим. Щелчок в конце прокрутки немного отвлекает и может показаться немного странным, если вы все еще держитесь за большой палец полосы прокрутки.

Я думаю, что единственный способ создать ощущение, что вы обновляете список элементов, а не плавно прокручиваете страницу, - это обрабатывать события прокрутки и вручную размещать элементы, чтобы строки всегда были привязаны к четному приращению строки. Я создал подобный виртуальный список еще во времена IE5, но надеялся на более современную реализацию. :)


person jdunning    schedule 15.09.2017    source источник


Ответы (1)


Это не тот вариант использования, который я реализовал раньше, поэтому я особо не задумывался об этом, но вы могли бы использовать обработчик обработанных ошибок onScroll или onSectionRendered для вызова _ 3_ и привязать к определенной строке .

Изменить: вот примерный пример того, о чем я говорю: https://codesandbox.io/s/545y634jxx

person bvaughn    schedule 15.09.2017
comment
Спасибо. Я попробовал кое-что из предложенных вами строк и добавил этот код в сообщение. Это работает, но щелчок в конце немного отвлекает. Я думаю, что если я хочу пойти в этом направлении, мне может потребоваться программная обработка прокрутки, чтобы строки сдвигались только на целые приращения строки. - person jdunning; 16.09.2017
comment
Понял. FWIW Я добавил ссылку на CodeSandbox, демонстрирующую технику, о которой я говорил (хотя мы, вероятно, хорошо понимаем друг друга). Так, на всякий случай. :) - person bvaughn; 16.09.2017
comment
Спасибо! Я не знал оcodeandbox.io. Выглядит удобно. - person jdunning; 16.09.2017
comment
к сожалению ссылка не работает - person Developia; 12.05.2018
comment
Прости. Полагаю, я не понимал, что это было где-то связано. Некоторое время назад мне пришлось удалить наши ссылки на песочницу кода, потому что их количество на одну учетную запись ограничено. Вот его быстрое воссоздание (если мне не изменяет память). Я обновлю ссылку в исходном ответе. codeandbox.io/s/545y634jxx - person bvaughn; 12.05.2018