【问题标题】:Is it possible for a React Virtualized list to snap to a full row when scrolling?滚动时 React Virtualized 列表是否可以对齐整行?
【发布时间】:2017-09-15 16:55:40
【问题描述】:

我有一个 React Virtualized <List> 组件,用作下拉菜单。我希望列表一次滚动一整行,就像普通的操作系统级菜单一样,或者至少在滚动停止时捕捉到整行。

我已经设置了scrollToAlignment="top",认为可能会这样做,但现在我意识到设置scrollToIndex 时会搞砸滚动行为。

有一个onScroll 事件,我想如果在某个窗口内未收到另一个事件,我可以设置一个超时触发,然后强制scrollTop 显示整行。但我希望可能有一种更清洁的方法。

可能的解决方案

与 brianvaughn 的 answer below 类似,我使用 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 时代,我建立了一个类似的虚拟列表,但希望有一个更现代的实现。 :)

【问题讨论】:

    标签: javascript reactjs react-virtualized


    【解决方案1】:

    这不是我之前实现过的用例,所以我没有考虑太多,但您可以使用去抖动的onScrollonSectionRendered 处理程序来调用@987654321 @ 并捕捉到特定行。

    编辑:这是我所说的一个粗略示例:https://codesandbox.io/s/545y634jxx

    【讨论】:

    • 谢谢。我按照您的建议尝试了一些方法,并将该代码添加到帖子中。它有效,但最后的快照有点分散注意力。我想如果我想朝这个方向发展,我可能需要以编程方式处理滚动,以便行仅以整行增量移动。
    • 明白。 FWIW 我添加了一个指向 CodeSandbox 的链接,演示了我所指的技术(尽管我们可能彼此非常了解)。以防万一。 :)
    • 谢谢!我不知道codeandbox.io。看起来很方便。
    • 很遗憾链接已损坏
    • 对不起。我想我没有意识到这个链接到任何地方。前段时间不得不清除我的代码沙箱链接,因为每个帐户的数量有限。这是它的快速重现(如果有记忆的话)。我将更新原始答案中的链接。 codesandbox.io/s/545y634jxx
    猜你喜欢
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2017-04-20
    • 2021-10-15
    • 2016-11-25
    • 2020-12-04
    • 2023-04-10
    相关资源
    最近更新 更多