【问题标题】:what onEndReachedThreshold really means in react-nativeonEndReachedThreshold 在 react-native 中的真正含义
【发布时间】:2016-09-07 09:37:44
【问题描述】:

from documentation:

onEndReachedThreshold 数量

调用 onEndReached 的像素阈值(虚拟的,非物理的)。 所以我只是想知道它是什么意思,是从顶部开始的阈值,还是从底部开始的阈值。

从顶部? - 如果我设置了 onEndReachedThreshold ={10} 的值,当我滚动到 10 像素或其他内容时,我的 onEndReached 是否会被调用。

从底部? - 如果我设置 onEndReachedThreshold ={listview height -10} 的值,我的 onEndReached 会在我滚动到 10 像素或其他内容时立即调用。

【问题讨论】:

    标签: android listview react-native


    【解决方案1】:

    对于使用FlatList INSTEAD of ListView的任何人,请注意参数单位已更改。

    对于ListView,它是从底部算起的像素,但根据docs for FlatList,它是列表项中从底部算起的长度单位。

    列表的底部边缘必须距内容的末尾多远(以列表的可见长度为单位)才能触发 onEndReached 回调。因此,当内容的结尾在列表可见长度的一半以内时,值 0.5 将触发 onEndReached。

    因此,如果您希望在用户位于当前数据集的一半时更新列表,请将值设置为 0.5

    【讨论】:

    • 不是“当前数据集”,而是“列表可见长度的一半”。所以这个距离会根据列表的“可见”高度而有所不同。
    • 如果列表的长度是 20,可见元素的长度是 6,那么 0.5 是如何工作的?当滚动到 18 个元素时,我怎样才能实现像 onEndReached 一样的调用?
    • @AshokDevatwal - 如果您的长度为 20 并且您将限制设置为 0.5,则当您滚动到第 10 项时将调用它。如果您想在 18 处执行此操作,请将其设置为18/20=0.9
    • @jhm 不正确。 “当内容的结尾在列表可见长度的一半以内时,0.5 的值将触发 onEndReached。”是关键部分。如果你想在 18 点触发它,那么将 onEndReachedThreadhold 设置为 0.9 意味着 20 - ( 0.9 * 6 ) = 14.6。它会在项目 14 或 15 显示时触发onEndReached。要在 18 点触发,计算公式为:20 - 18 = 2. 2 / 6 = 0.333。将其设置为 0.333onEndReached 将在项目 18 周围被调用(即当大约 2 个项目低于可见线时)。
    • @halbano 因为 6 是屏幕上可见元素的数量。 这真是令人困惑(我不得不重新阅读我自己的评论几次才能再次理解它)所以不要因为没有马上得到它而感到难过。
    【解决方案2】:

    documentation 永远是最好的选择:

    onEndReached 函数
    当所有行都已呈现并且列表已滚动到 onEndReachedThreshold 底部内时调用。提供原生滚动事件。

    onEndReachedThreshold 数字
    以像素为单位的阈值(虚拟的,而非物理的)用于调用 onEndReached。

    所以在我看来: 如果你这样做 onEndReachedThreshold ={10} 它会调用 onEndReached 如果你从底部滚动到 10 个像素

    【讨论】:

    • 所以如果我必须在有人从顶部滚动 10 像素时立即调用 onEndReached,那么我必须设置 onEndReachedThreshold ={lenght of listview -10},对吗?
    • @ManjeetSingh 不,您必须将其设置为 onEndReachedThreshold ={10}
    • @ManjeetSingh 我不建议依赖顶部的关系。这很容易以无限循环结束
    • @ManjeetSingh 您应该将此答案设置为正确答案,10 表示距离底部 10px 等等
    • @fareednamrouti onEndReachedThreshold 从来没有像我预期的那样表现,但这个答案似乎清楚地说明了文档想要传达的内容。接受
    【解决方案3】:

    在 2020 年,onEndReachedThreshold 表示在触发事件之前您应该从底部开始的屏幕长度数。

    我使用 onEndReachedThreshold={2} 在两个全屏长度之外触发 onEndReached。

    【讨论】:

    • 这是2020年的正确答案,我不知道为什么文档没有提到!
    • 这是我一直在寻找的,由于某种原因,文档并没有为我所用。这个答案做到了。谢谢。
    • 在 2021 年,这仍然令人困惑,但现在对我来说是有意义的。我不明白为什么文档没有提到这个值的范围。通过阅读文档,大家都认为这应该是一个介于0和1之间的值,这是不正确的!
    • 我认为你的意思是两个完整的 list length 距离而不是 screen
    【解决方案4】:

    这取决于源代码的工作方式:

    const {contentLength, visibleLength, offset} = this._scrollMetrics;
    const distanceFromEnd = contentLength - visibleLength - offset;
    if (
      onEndReached &&
      this.state.last === getItemCount(data) - 1 &&
      distanceFromEnd < onEndReachedThreshold * visibleLength &&
      (this._hasDataChangedSinceEndReached ||
        this._scrollMetrics.contentLength !== this._sentEndForContentLength)
    ) {
      // Only call onEndReached once for a given dataset + content length.
      this._hasDataChangedSinceEndReached = false;
      this._sentEndForContentLength = this._scrollMetrics.contentLength;
      onEndReached({distanceFromEnd});
    }
    

    因此,首先它检查 onEndReached 回调是否存在,然后检查数据的最后一个元素是否已呈现(不一定可见),然后才检查您是否滚动到列表底部。

    visibleLength 这里是列表元素的高度(如果未设置水平),contentLength 是列表元素容器的高度乘以数据中的元素数。 如您所见,onEndReachedThreshold 是“可见屏幕”(即列表元素的高度)的倒数,您应该滚动直到触发 onEndReached 回调 - onEndReachedThreshold 越大,您越少应该滚动。使用 onEndReachedThreshold = 0.5 的值,您的回调将几乎在列表的“末尾”处触发。但请记住,无论您设置什么值,它不会触发直到最后一个元素被渲染。

    【讨论】:

    • 嗨,visibleLength here is the height of your list element,你的意思是 visibleLength 是列表中单个项目的高度吗?还是 FlatList 元素的高度?什么是`列表元素容器`?你是说包裹物品的那个吗?例如 hello
    • @VidyVideni,您找到问题的答案了吗?我也需要这个
    猜你喜欢
    • 2021-12-05
    • 1970-01-01
    • 2013-10-09
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2018-01-28
    相关资源
    最近更新 更多