Skip to content

xtf-infinite-scroll

组件说明

xtf-infinite-scroll 是无限滚动组件,用于列表滚动到底部自动加载更多数据。支持多种加载指示器样式、加载失败重试和加载完成提示,适用于商品列表、消息流和数据分页等场景。


基础用法

1. 基础用法

通过 loadingfinished 控制加载状态:

vue
<template>
  <xtf-infinite-scroll :loading="loading" :finished="finished" @load="onLoad">
    <xtf-cell v-for="item in list" :key="item.id" :title="item.title" :desc="item.desc" />
  </xtf-infinite-scroll>
</template>

<script>
export default {
  data() {
    return {
      list: [],
      loading: false,
      finished: false,
      page: 1
    }
  },
  methods: {
    onLoad() {
      this.loading = true
      setTimeout(() => {
        const newItems = Array.from({ length: 10 }, (_, i) => ({
          id: this.page * 10 + i,
          title: '项目 ' + (this.page * 10 + i),
          desc: '描述信息'
        }))
        this.list = this.list.concat(newItems)
        this.page++
        this.loading = false
        if (this.page > 5) {
          this.finished = true
        }
      }, 1000)
    }
  }
}
</script>

2. 加载失败重试

通过 error 标记加载失败,点击可重试:

vue
<template>
  <xtf-infinite-scroll
    :loading="loading"
    :finished="finished"
    :error="error"
    @load="onLoad"
    @retry="onRetry"
  >
    <xtf-cell v-for="item in list" :key="item.id" :title="item.title" />
  </xtf-infinite-scroll>
</template>

<script>
export default {
  data() {
    return {
      list: [],
      loading: false,
      finished: false,
      error: false,
      page: 1
    }
  },
  methods: {
    onLoad() {
      this.loading = true
      this.error = false
      this.fetchData()
    },
    onRetry() {
      console.log('准备重试')
    },
    fetchData() {
      setTimeout(() => {
        if (this.page === 3) {
          this.error = true
          this.loading = false
          return
        }
        const newItems = Array.from({ length: 10 }, (_, i) => ({
          id: this.page * 10 + i,
          title: '项目 ' + (this.page * 10 + i)
        }))
        this.list = this.list.concat(newItems)
        this.page++
        this.loading = false
        if (this.page > 5) this.finished = true
      }, 1000)
    }
  }
}
</script>

3. 自定义指示器样式

通过 indicatorStyle 设置加载指示器样式:

vue
<template>
  <xtf-infinite-scroll
    :loading="loading"
    :finished="finished"
    indicator-style="dots"
    @load="onLoad"
  >
    <xtf-cell v-for="item in list" :key="item.id" :title="item.title" />
  </xtf-infinite-scroll>
</template>

全部属性

属性类型默认值作用描述适用范围
loadingBooleanfalse是否加载中状态
finishedBooleanfalse是否加载完成状态
errorBooleanfalse是否加载失败状态
offsetString | Number'300'触发距离(px)触发
triggerHeightString | Number''触发高度触发
directionString'down'滚动方向方向
immediateCheckBooleantrue是否立即检查初始化
scrollTargetString | Object''滚动容器容器
disabledBooleanfalse是否禁用禁用
loadingTextString''加载文字文字
finishedTextString''完成文字文字
errorTextString''错误文字文字
pullTextString''上拉提示文字文字
indicatorStyleString'default'指示器样式样式
customClassString''自定义类名样式覆盖
customStyleString | Object''自定义样式动态样式覆盖

事件

事件名称触发时机回调参数参数说明
load触发加载时触发--
retry点击重试时触发--

插槽

插槽名称说明
default列表内容

方法

方法名参数返回值说明
check--立即执行一次加载位置检查;满足触发条件时触发 load 事件
vue
<template>
  <view>
    <xtf-button label="检查加载位置" @click="checkLoadPosition" />
    <xtf-infinite-scroll
      ref="infiniteScroll"
      :loading="loading"
      :finished="finished"
      @load="onLoad"
    >
      <xtf-cell v-for="item in list" :key="item.id" :title="item.title" />
    </xtf-infinite-scroll>
  </view>
</template>

<script>
export default {
  data() {
    return { list: [{ id: 1, title: '初始数据' }], loading: false, finished: false }
  },
  methods: {
    checkLoadPosition() {
      this.$refs.infiniteScroll.check()
    },
    onLoad() {
      this.loading = true
      setTimeout(() => {
        this.finished = true
        this.loading = false
      }, 300)
    }
  }
}
</script>

主题说明

  • 加载指示器支持 defaultdotsringgradientcardpillsneonminimalboldsplit 样式
  • 加载动画使用 xtf-loading 组件
  • 文字使用灰色辅助色

如需全局调整主题,请在 xtf-config-provider 或主题配置中覆盖相关 CSS 变量。

MIT Licensed