tingyuxuan2302 / taro3-virtual-list

基于taro3封装的虚拟列表,对列表节点不等高以及白屏等问题支持友好,无计算量,性能优异,支持各大小程序以及h5页面
MIT License
190 stars 26 forks source link

当数据源从多变成少的时候,scrollView的滚动高度,不会随着改变 #26

Closed zzq1101921989 closed 2 years ago

zzq1101921989 commented 2 years ago

有一个问题,当数据源从多变成少的时候,scrollView的滚动高度,不会随着改变,并且上滑的时候 会疯狂的闪屏

const isLowerThreshold = total >= query.rowsPerPage;

<TaroVirtualList
  list={list}
  listId='legworkId'
  segmentNum={isLowerThreshold ? query.rowsPerPage : total}
  autoScrollTop={autoScrollTop}
  listType='multi'
  pageNum={query.pageNo}
  className={styles.indexListContainer}
  scrollViewProps={{
    onScrollToLower: onPageScrollToLower,
  }}
  onRender={(item, index) => {
    return <ListItem data={item} index={index} />;
  }}

isLowerThreshold 想着如果获取到的数据只有个位数的话,每次展示的条数也应当进行调整,当时发现没什么用 autoScrollTop也是为了点击筛选的时候自动滚动到顶部设置的

大佬有空帮忙看看这个问题

zzq1101921989 commented 2 years ago

当我看了一下源码,问题可能出在 这一部分,因为我的页码是 从 第二页更新 到第一页的 并且刚好就是等于 1

  if (pageNum < oldPageNUm && pageNum == 1) {
    this.initList = []
    this.setState({
      innerScrollTop: 1,
    })
    this.setState({
      wholePageIndex: 0,
      isComplete: false,
      twoList: [],
    }, () => {
      if (nextProps.list?.length) {
        this.formatMultiList(nextProps.list, pageNum)
      } else {
        this.handleComplete()
      }
    })
    Taro.nextTick(() => {
      this.setState({
        innerScrollTop: 0,
      })
    })
  }

image 这图是我加载到第二页的时候数据的构成

image 这图是我筛选某个条件之后,数据的构成,出现莫名的undefined

image 还有更奇怪的就是list里面竟然会出现高度

tingyuxuan2302 commented 2 years ago

有一个问题,当数据源从多变成少的时候,scrollView的滚动高度,不会随着改变,并且上滑的时候 会疯狂的闪屏

const isLowerThreshold = total >= query.rowsPerPage;

<TaroVirtualList
  list={list}
  listId='legworkId'
  segmentNum={isLowerThreshold ? query.rowsPerPage : total}
  autoScrollTop={autoScrollTop}
  listType='multi'
  pageNum={query.pageNo}
  className={styles.indexListContainer}
  scrollViewProps={{
    onScrollToLower: onPageScrollToLower,
  }}
  onRender={(item, index) => {
    return <ListItem data={item} index={index} />;
  }}

isLowerThreshold 想着如果获取到的数据只有个位数的话,每次展示的条数也应当进行调整,当时发现没什么用 autoScrollTop也是为了点击筛选的时候自动滚动到顶部设置的

大佬有空帮忙看看这个问题

segmentNum是无法动态去修改的,因为如果动态去给数据分页,会导致分页错乱,看了你的代码意思就是说如果total没有一页数据量,你就将segmentNum=total,其实没必要啊,我认为这个操作是个无效操作,也起不到提升性能的作用,其次autoScrollTop如果不设置的话,组件是会根据list的改变去将页面置顶的,设置了的话,你就要自己去控制了

zzq1101921989 commented 2 years ago

有一个问题,当数据源从多变成少的时候,scrollView的滚动高度,不会随着改变,并且上滑的时候 会疯狂的闪屏 const isLowerThreshold = total >= query.rowsPerPage;

<TaroVirtualList
  list={list}
  listId='legworkId'
  segmentNum={isLowerThreshold ? query.rowsPerPage : total}
  autoScrollTop={autoScrollTop}
  listType='multi'
  pageNum={query.pageNo}
  className={styles.indexListContainer}
  scrollViewProps={{
    onScrollToLower: onPageScrollToLower,
  }}
  onRender={(item, index) => {
    return <ListItem data={item} index={index} />;
  }}

isLowerThreshold 想着如果获取到的数据只有个位数的话,每次展示的条数也应当进行调整,当时发现没什么用 autoScrollTop也是为了点击筛选的时候自动滚动到顶部设置的 大佬有空帮忙看看这个问题

segmentNum是无法动态去修改的,因为如果动态去给数据分页,会导致分页错乱,看了你的代码意思就是说如果total没有一页数据量,你就将segmentNum=total,其实没必要啊,我认为这个操作是个无效操作,也起不到提升性能的作用,其次autoScrollTop如果不设置的话,组件是会根据list的改变去将页面置顶的,设置了的话,你就要自己去控制了

是的,后面代码我改动了一下,autoScrollTop为false,并且在 scrollViewProps中的scrollTop给一个0-1的随机数进行置顶效果,但是在服务端分页的时候,分页到第二页的时候,后续进行筛选功能操作,我看到您开发的组件实例内部的state就出现了意外的数值了

tingyuxuan2302 commented 2 years ago

有一个问题,当数据源从多变成少的时候,scrollView的滚动高度,不会随着改变,并且上滑的时候 会疯狂的闪屏 const isLowerThreshold = total >= query.rowsPerPage;

<TaroVirtualList
  list={list}
  listId='legworkId'
  segmentNum={isLowerThreshold ? query.rowsPerPage : total}
  autoScrollTop={autoScrollTop}
  listType='multi'
  pageNum={query.pageNo}
  className={styles.indexListContainer}
  scrollViewProps={{
    onScrollToLower: onPageScrollToLower,
  }}
  onRender={(item, index) => {
    return <ListItem data={item} index={index} />;
  }}

isLowerThreshold 想着如果获取到的数据只有个位数的话,每次展示的条数也应当进行调整,当时发现没什么用 autoScrollTop也是为了点击筛选的时候自动滚动到顶部设置的 大佬有空帮忙看看这个问题

segmentNum是无法动态去修改的,因为如果动态去给数据分页,会导致分页错乱,看了你的代码意思就是说如果total没有一页数据量,你就将segmentNum=total,其实没必要啊,我认为这个操作是个无效操作,也起不到提升性能的作用,其次autoScrollTop如果不设置的话,组件是会根据list的改变去将页面置顶的,设置了的话,你就要自己去控制了

是的,后面代码我改动了一下,autoScrollTop为false,并且在 scrollViewProps中的scrollTop给一个0-1的随机数进行置顶效果,但是在服务端分页的时候,分页到第二页的时候,后续进行筛选功能操作,我看到您开发的组件实例内部的state就出现了意外的数值了

服务端分页的时候注意不要修改list的引用,而是向list去concat数据,本来就是要出现高度的哈,原理就是用高度占位的,可以有时间再看看源码哈哈

zzq1101921989 commented 2 years ago

有一个问题,当数据源从多变成少的时候,scrollView的滚动高度,不会随着改变,并且上滑的时候 会疯狂的闪屏 const isLowerThreshold = total >= query.rowsPerPage;

<TaroVirtualList
  list={list}
  listId='legworkId'
  segmentNum={isLowerThreshold ? query.rowsPerPage : total}
  autoScrollTop={autoScrollTop}
  listType='multi'
  pageNum={query.pageNo}
  className={styles.indexListContainer}
  scrollViewProps={{
    onScrollToLower: onPageScrollToLower,
  }}
  onRender={(item, index) => {
    return <ListItem data={item} index={index} />;
  }}

isLowerThreshold 想着如果获取到的数据只有个位数的话,每次展示的条数也应当进行调整,当时发现没什么用 autoScrollTop也是为了点击筛选的时候自动滚动到顶部设置的 大佬有空帮忙看看这个问题

segmentNum是无法动态去修改的,因为如果动态去给数据分页,会导致分页错乱,看了你的代码意思就是说如果total没有一页数据量,你就将segmentNum=total,其实没必要啊,我认为这个操作是个无效操作,也起不到提升性能的作用,其次autoScrollTop如果不设置的话,组件是会根据list的改变去将页面置顶的,设置了的话,你就要自己去控制了

是的,后面代码我改动了一下,autoScrollTop为false,并且在 scrollViewProps中的scrollTop给一个0-1的随机数进行置顶效果,但是在服务端分页的时候,分页到第二页的时候,后续进行筛选功能操作,我看到您开发的组件实例内部的state就出现了意外的数值了

服务端分页的时候注意不要修改list的引用,而是向list去concat数据,本来就是要出现高度的哈,原理就是用高度占位的,可以有时间再看看源码哈哈

所以意思就是不在需要去setState我的list追加数据,而是直接concat,然后直接通过一个this.forceUpdate强制刷新一下就好了是吗

tingyuxuan2302 commented 2 years ago

有一个问题,当数据源从多变成少的时候,scrollView的滚动高度,不会随着改变,并且上滑的时候 会疯狂的闪屏 const isLowerThreshold = total >= query.rowsPerPage;

<TaroVirtualList
  list={list}
  listId='legworkId'
  segmentNum={isLowerThreshold ? query.rowsPerPage : total}
  autoScrollTop={autoScrollTop}
  listType='multi'
  pageNum={query.pageNo}
  className={styles.indexListContainer}
  scrollViewProps={{
    onScrollToLower: onPageScrollToLower,
  }}
  onRender={(item, index) => {
    return <ListItem data={item} index={index} />;
  }}

isLowerThreshold 想着如果获取到的数据只有个位数的话,每次展示的条数也应当进行调整,当时发现没什么用 autoScrollTop也是为了点击筛选的时候自动滚动到顶部设置的 大佬有空帮忙看看这个问题

segmentNum是无法动态去修改的,因为如果动态去给数据分页,会导致分页错乱,看了你的代码意思就是说如果total没有一页数据量,你就将segmentNum=total,其实没必要啊,我认为这个操作是个无效操作,也起不到提升性能的作用,其次autoScrollTop如果不设置的话,组件是会根据list的改变去将页面置顶的,设置了的话,你就要自己去控制了

是的,后面代码我改动了一下,autoScrollTop为false,并且在 scrollViewProps中的scrollTop给一个0-1的随机数进行置顶效果,但是在服务端分页的时候,分页到第二页的时候,后续进行筛选功能操作,我看到您开发的组件实例内部的state就出现了意外的数值了

服务端分页的时候注意不要修改list的引用,而是向list去concat数据,本来就是要出现高度的哈,原理就是用高度占位的,可以有时间再看看源码哈哈

所以意思就是不在需要去setState我的list追加数据,而是直接concat,然后直接通过一个this.forceUpdate强制刷新一下就好了是吗

说错了,是要更换一个新的引用,可以看下src/pages/virtual-list-demo/index.tsx的代码,这是demo

zzq1101921989 commented 2 years ago

有一个问题,当数据源从多变成少的时候,scrollView的滚动高度,不会随着改变,并且上滑的时候 会疯狂的闪屏 const isLowerThreshold = total >= query.rowsPerPage;

<TaroVirtualList
  list={list}
  listId='legworkId'
  segmentNum={isLowerThreshold ? query.rowsPerPage : total}
  autoScrollTop={autoScrollTop}
  listType='multi'
  pageNum={query.pageNo}
  className={styles.indexListContainer}
  scrollViewProps={{
    onScrollToLower: onPageScrollToLower,
  }}
  onRender={(item, index) => {
    return <ListItem data={item} index={index} />;
  }}

isLowerThreshold 想着如果获取到的数据只有个位数的话,每次展示的条数也应当进行调整,当时发现没什么用 autoScrollTop也是为了点击筛选的时候自动滚动到顶部设置的 大佬有空帮忙看看这个问题

segmentNum是无法动态去修改的,因为如果动态去给数据分页,会导致分页错乱,看了你的代码意思就是说如果total没有一页数据量,你就将segmentNum=total,其实没必要啊,我认为这个操作是个无效操作,也起不到提升性能的作用,其次autoScrollTop如果不设置的话,组件是会根据list的改变去将页面置顶的,设置了的话,你就要自己去控制了

是的,后面代码我改动了一下,autoScrollTop为false,并且在 scrollViewProps中的scrollTop给一个0-1的随机数进行置顶效果,但是在服务端分页的时候,分页到第二页的时候,后续进行筛选功能操作,我看到您开发的组件实例内部的state就出现了意外的数值了

服务端分页的时候注意不要修改list的引用,而是向list去concat数据,本来就是要出现高度的哈,原理就是用高度占位的,可以有时间再看看源码哈哈

所以意思就是不在需要去setState我的list追加数据,而是直接concat,然后直接通过一个this.forceUpdate强制刷新一下就好了是吗

说错了,是要更换一个新的引用,可以看下src/pages/virtual-list-demo/index.tsx的代码,这是demo

zzq1101921989 commented 2 years ago

src/pages/virtual-list-demo/index.tsx

好嘞谢谢大佬