Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

scrollToIndex在DataSource改变之后跳转不正确 #202

Closed
CalvinChen opened this issue May 3, 2020 · 9 comments
Closed

scrollToIndex在DataSource改变之后跳转不正确 #202

CalvinChen opened this issue May 3, 2020 · 9 comments
Labels

Comments

@CalvinChen
Copy link

如题,我使用的是目前最新2.1.7的版本。

在DataSource没有改变之前调用scrollToIndex函数跳转是OK的,但是当改变了DataSource,比如删除某些数组项,我再调用这个函数,传入了新的index,那么就会跳转到不是这个index的另外一个index上。

麻烦看一下。

@CalvinChen CalvinChen added the bug label May 3, 2020
@tangbc
Copy link
Owner

tangbc commented May 4, 2020

v2.1.8 已修复。

@tangbc tangbc closed this as completed May 4, 2020
@CalvinChen
Copy link
Author

CalvinChen commented May 6, 2020

抱歉,更新后试用了一下,发现还是有点问题。

跟踪了一下代码,发现在根据index计算offset,逐个遍历index的时候,如果是sizes这个map里没有的id,会用firstRangeAverageSize这个值。但是这个值我看了一下不是很对,我的列表每一项都是固定高度,而且也设置了estimate-size为准确值,但是这个firstRangeAverageSize的值好像是vue-virtual-scroll-list控件在页面中的实际高度,因此offset逐项加起来的时候最终offset会比实际高很多。

如果我事先滚动到要跳转的index,此时sizes里面需要的id的高度都有了,跳转就不会有上述问题。

感谢作者麻烦再看一下。🤝 @tangbc

@tangbc
Copy link
Owner

tangbc commented May 6, 2020

如果每一项都是固定高度那 firstRangeAverageSize 就一直是正确值,如发现不正确贴下代码或者截图看看。

@CalvinChen
Copy link
Author

@tangbc
我找到原因了,应该是在控件更新的时候多次调用saveSize但是没有对重复id进行过滤导致总高度重复计算。
我在saveSize方法开头加上已下判断就一切正常了:

    if (this.sizes.has(id)) {
      return;
    }

麻烦抽空看下。

@tangbc
Copy link
Owner

tangbc commented May 6, 2020

不应该简单粗暴直接 return 掉,这样的话某个 id 高度的变化就无法更新了。

总的来说,还是希望能具体描述下如何复现,最好 fork 一个 demo https://codesandbox.io/s/live-demo-virtual-list-e1ww1。

@tangbc
Copy link
Owner

tangbc commented May 6, 2020

你说的“总高度重复计算”是指 this.firstRangeAverageSize 这个值在固定高度选项的情况下发生重复计算吗?

@CalvinChen
Copy link
Author

你说的“总高度重复计算”是指 this.firstRangeAverageSize 这个值在固定高度选项的情况下发生重复计算吗?

对,我看代码firstRangeAverageSize这个变量取决于firstRangeTotalSizesizes.size,在我不滚动的情况下sizes.size是固定的比如说20,但是这个firstRangeTotalSize在代码里面看是只会增不会减的。

我现在的场景就是整个dataSources都更新了,触发了高度改变的事件,进入到saveSize 方法里面,因为没有对重复id进行过滤,导致firstRangeTotalSize又增大了,但是sizes.size依旧是20,这样除下来就影响到firstRangeAverageSize,以至于出现我所说的问题了。

如果你那边还无法重现的话我稍后在你那个demo里看看能不能复现,感谢。

@CalvinChen
Copy link
Author

可以复现:https://codesandbox.io/s/live-demo-virtual-list-4wbnp

操作步骤是这样的:

第一种稍微正常的情况:进去直接点jump432,这个时候会跳到400多,但是不是432,我不知道这样算不算正常;

第二种情况异常情况:先刷新页面,进去点击几次addNum,多次改变dataSource,再点jump432,这个时候会跳到900+。

tangbc added a commit that referenced this issue May 6, 2020
@tangbc
Copy link
Owner

tangbc commented May 6, 2020

v2.1.9 已发布修复。

基于你的 demo 更新了 npm 版本:https://codesandbox.io/s/live-demo-virtual-list-50f77

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants