您现在的位置是:首页 > 技术教程 正文

vue3+element-plus 通过v-infinite实现下拉滚动无限加载

admin 阅读: 2024-03-31
后台-插件-广告管理-内容页头部广告(手机)

v-infinite官网

v-infinite-scroll无限滚动组件使用详解

  1. 1、v-infinite-scroll="load" //load无限滚动加载的方法
  2. 2、infinite-scroll-disabled //是否禁用无限滚动加载
  3. 3、infinite-scroll-delay //节流时延,单位为ms
  4. 4、infinite-scroll-distance //触发加载的距离阈值,单位为px
  5. 5、infinite-scroll-immediate //是否立即执行加载方法,以防初始状态下内容无法撑满容器。
  6. //默认情况下,infinite-scroll-disabled是false,因此如果组件使用无限滚动加载组件,即使在vue不进行加载方法的调用,组件也会调用该方法,因此如果需要控制的话,尽量是使用infinite-scroll-disabled属性来进行加载方法是否调用的控制。

 官网给到的基础案例:

  1. <template>
  2. <ul v-infinite-scroll="load" class="infinite-list" style="overflow: auto">
  3. <li v-for="i in count" :key="i" class="infinite-list-item">{{ i }}li>
  4. ul>
  5. template>
  6. <script lang="ts" setup>
  7. import { ref } from 'vue'
  8. const count = ref(0)
  9. const load = () => {
  10. count.value += 2
  11. }
  12. script>
  13. <style>
  14. .infinite-list {
  15. height: 300px;
  16. padding: 0;
  17. margin: 0;
  18. list-style: none;
  19. }
  20. .infinite-list .infinite-list-item {
  21. display: flex;
  22. align-items: center;
  23. justify-content: center;
  24. height: 50px;
  25. background: var(--el-color-primary-light-9);
  26. margin: 10px;
  27. color: var(--el-color-primary);
  28. }
  29. .infinite-list .infinite-list-item + .list-item {
  30. margin-top: 10px;
  31. }
  32. style>

自己写了一个简单的demo:

  1. <div>
  2. <el-select v-model="value" style="margin-right: 20px" v-if="isMounted">
  3. <div v-infinite-scroll="load" infinite-scroll-immediate="false" style="overflow: hidden">div>
  4. <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
  5. el-select>
  6. div>
  7. <script setup>
  8. const value = ref('')
  9. let options = reactive([{
  10. value: "aaa",
  11. label: "atext"
  12. },
  13. {
  14. value: "bbb",
  15. label: "atext"
  16. }, {
  17. value: "cccc",
  18. label: "atext"
  19. }, {
  20. value: "cccc",
  21. label: "atext"
  22. }, {
  23. value: "cccc",
  24. label: "atext"
  25. }, {
  26. value: "cccc",
  27. label: "atext"
  28. }, {
  29. value: "cccc",
  30. label: "atext"
  31. }, {
  32. value: "cccc",
  33. label: "atext"
  34. }, {
  35. value: "cccc",
  36. label: "atext"
  37. }, {
  38. value: "cccc",
  39. label: "atext"
  40. }, {
  41. value: "ddd",
  42. label: "dtext"
  43. }, {
  44. value: "yyyy",
  45. label: "dtext"
  46. }
  47. ])
  48. const load = () => {
  49. options.push({
  50. value: "xxxx",
  51. label: "xtext"
  52. })
  53. }
  54. const isMounted = ref(false);
  55. onMounted(() => {
  56. isMounted.value = true;
  57. });
  58. script>

当使用v-infinite时,控制台会报错:

 原因:

官方上的Issues解释是需要nextTick()之后再去显示
解决方法是组件挂载完成再去显示el-select组件

所以在上面demo中select组件加了v-if,并且在onMounted中将其再显示出来。

报错解决问题是掘金上的一位大哥的方法,原文地https://juejin.cn/post/7095925947412512804

 

 上面el-select组件的下拉加载,看完可能会有两个疑问,一个是为什么el-option不写在v-infinite-scroll标签内部,二是为什么v-infinite-scroll 所在的标签的overflow属性不是和官网一样的atuo,二是hidden,因为在此案例中放到内部或不放在内部效果一样的,最核心的是如果此案例中,并没有给v-infinite-scroll所在的标签设置高度,理应是下拉加载会失效,但是如果是hidden的话,并且此时高度为0,那么只要鼠标滚轮滑动,那么就会触发下拉加载,

总结下拉就是,此案例效果是打开下拉框,只要滑动滚轮就触发下拉加载,二官网那种标准案例,是滚轮滑动到底部才会触发下拉加载。

如果是官网那种标准做法需要注意:使用v-infinite-scroll的元素设置overflow: hidden以及固定高度

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索
排行榜