vant-UI 组件的List渲染列表多页列表 切换不加载的问题
1 数据渲染
template
1 | <van-list |
2 | v-for="items in tabbar" |
3 | :key="items.id" |
4 | v-show="items.isActive" |
5 | v-model="items.loading" |
6 | :finished="items.finished" |
7 | finished-text="没有更多了" |
8 | @load="onLoad(items)" |
9 | ref="listItem" |
10 | > |
11 | <van-cell v-for="item in items.list" :key="item" :title="item">{{ |
12 | items.value |
13 | }}</van-cell> |
14 | </van-list> |
data
1 | data() { |
2 | return { |
3 | tabbar: [ |
4 | { |
5 | id: 1, |
6 | value: "Lorem", |
7 | isActive: true, |
8 | loading: false, |
9 | finished: false, |
10 | list: [], |
11 | }, |
12 | { |
13 | id: 2, |
14 | value: "Lorem2", |
15 | isActive: false, |
16 | loading: false, |
17 | finished: false, |
18 | list: [], |
19 | }, |
20 | { |
21 | id: 3, |
22 | value: "Lorem3", |
23 | isActive: false, |
24 | loading: false, |
25 | finished: false, |
26 | list: [], |
27 | }, |
28 | ], |
29 | }; |
30 | }, |
methods
1 | onLoad(obj) { |
2 | // 异步更新数据 |
3 | // setTimeout 仅做示例,真实场景中一般为 ajax 请求 |
4 | setTimeout(() => { |
5 | for (let i = 0; i < 10; i++) { |
6 | obj.list.push(obj.list.length + 1); |
7 | } |
8 | |
9 | console.log(obj.id); |
10 | console.log(obj.finished); |
11 | |
12 | // 加载状态结束 |
13 | obj.loading = false; |
14 | |
15 | // 数据全部加载完成 |
16 | if (obj.list.length >= 40) { |
17 | obj.finished = true; |
18 | } |
19 | }, 1000); |
20 | }, |
21 | /** |
22 | * 切换选项 |
23 | * obj 选项的数据 |
24 | */ |
25 | onClickLoadData(obj) { |
26 | this.tabbar.forEach((item) => { |
27 | item.isActive = false; |
28 | }); |
29 | obj.isActive = true; |
30 | }, |
切换页面 会发现 数据不会加载
这是为什么呢?
这是因为页面渲染的时候 已经进行过加载了 在点击切换按钮的时候 并没有触发onload事件
那么你可能会说 那点击的时候调用一次onLoad事件不就好了么?
对 点击的时候调用一次onLoad是会触发调用
但是呢?
第一个问题:如果第一次加载的数据不足以铺满全屏,那么 数据就不会继续加载了
第二个问题:如果你的数据已经全部加载结束了,但是你点击切换的时候 由于你调用了onLoad事件。就还会触发。
那么!
你也许会问 那该怎么做呢?
那么现在我就告诉你
超简单 一行代码搞定
官方给了一个 check方法
所以 我们就可以这样做
1 | /** |
2 | * 切换选项 |
3 | * obj 选项的数据 |
4 | */ |
5 | onClickLoadData(obj) { |
6 | this.tabbar.forEach((item) => { |
7 | item.isActive = false; |
8 | }); |
9 | obj.isActive = true; |
10 | + this.$refs.listItem[obj.id - 1].check();检查点击的选项所显示的页面的滚动位置,若已滚动至底部,则会触发 load 事件 [obj.id - 1]为选中当前的list |
11 | }, |
完美搞定
2.遇到的坑 记录于2020.07.07
1.问题
在第一次打开页面刷印,且是第一次下啦都底部进行加载请求的时候,请求了两次。之后,只要不刷新页面,就不会再出现一下请求两次的问题。
2.出现这个问题,让小编疑惑到怀疑人生
刚开始,还以为是自己代码逻辑写错了!就一直读之前写的代码,看vant的文档。最终发现,代码没有任何问题。在网上查找,由于问题不好描述,也没有查到相应的答案。 痛苦至极
稳住心,开始在浏览器上测试,过一个小时左右时间的折腾,终于,找到了答案。
主要原因在于,下面下啦的内容是一个全局的懒加载组件,只有在使用到的时候,才会请求加载这个组件的js
可以看到,在第一次请求接口的完成后,才请求了这个js文件。之后由于页面还没有渲染,导致高度不够,所以就又请求了一次。
3. 解决问题
终于,找到了原因,接下来解决就很简单了。
方式一:把这个全局组件的懒加载去掉,改成不懒加载就好了。
方式二:把这个全局组件单独在这个页面引入一次。
注意:部分文章可能会在不就的将来更新
如果能够帮助到你,是小编最大的荣幸
当然 有 不好的地方 请大家帮忙指出 学习永无止境
小编一直认为 人外有人 天外有天 一起学习 共同进步
让我们共同加油吧!!!
原文作者: Yunjie Ge
原文链接: http://www.blog.geyunjie.com/2019/06/04/vant-list/
版权声明: 转载请注明出处(必须保留作者署名及链接)