IndexList

索引列表,提供了列表索引的功能,也是一个基于better-scroll进行封装的组件。

示例

  • 基本使用

    构造如示例中 cityData 这样结构的数据,传入 cube-index-list 组件的 data 属性。

    <cube-index-list
      :data="cityData"
      :title="title"
      @select="selectItem"
      @title-click="clickTitle"></cube-index-list>
    
    const cityData = [
      {
        "name": "★Hot City",
        "items": [
          {
            "name": "BEIJING",
            "value": 1
          },
          {
            "name": "SHANGHAI",
            "value": 2
          }
        ]
      },
      {
        "name": "A",
        "items": [
          {
            "name": "ANSHAN",
            "value": 3
          },
          {
            "name": "ANQING",
            "value": 4
          }
        ]
      }
    ]
    
    export default {
      data() {
        return {
          title: 'Current City: BEIJING',
          cityData: cityData
        }
      },
      methods: {
        selectItem(item) {
          console.log(item.name)
        },
        clickTitle(title) {
          console.log(title)
        }
      }
    }
    
  • 自定义插槽

    除了默认结构,你还可以根据自己的需要自定义每一项的内容。如下所示,将你的自定义内容项填入cube-index-list-item的插槽。除非你真的知道自己在做什么,否则不要修改cube-index-list-groupcube-index-list-item的用法。

    <cube-index-list :data="cityData">
      <cube-index-list-group
        v-for="(group, index) in cityData"
        :key="index"
        :group="group">
        <cube-index-list-item
          v-for="(item, index) in group.items"
          :key="index"
          :item="item"
          @select="selectItem">
          <div class="custom-item">我是自定义 {{item.name}}</div>
        </cube-index-list-item>
      </cube-index-list-group>
    </cube-index-list>
    
    export default {
      data() {
        return {
          cityData: cityData
        }
      },
      methods: {
        selectItem(item) {
          console.log(item.name)
        },
        clickTitle(title) {
          console.log(title)
        }
      }
    }
    
    // 自定义项的样式
    .custom-item
      position: relative
      height: 70px
      line-height: 70px
      padding: 0 16px
      font-size: $fontsize-medium
    
    // 用自定义样式,覆写内置的默认样式
    .cube-index-list-content
      background-color: #222
      color: #909090
    .cube-index-list-anchor
      background-color: #333
      height: 30px
      line-height: 30px
      padding: 0 0 0 20px
    .cube-index-list-nav
      padding: 20px 0
      border-radius: 10px
      background: rgba(0,0,0,.3)
      >ul
        >li
          padding: 3px
          font-size: 12px
          color: #909090
          &.active
            color: #ffcd32
    
  • 上拉加载

    可以通过 pullUpLoad 属性开启上拉加载功能,具体配置同 Scroll 组件的 options.pullUpLoad

    <cube-index-list
      ref="indexList"
      :data="data"
      :title="title"
      :pullUpLoad="true"
      @select="selectItem"
      @title-click="clickTitle"
      @pulling-up="onPullingUp">
    </cube-index-list>
    
    export default {
      data() {
        return {
          title: 'Current City: BEIJING',
          data: cityData.slice(0, 4)
        }
      },
      methods: {
        selectItem(item) {
          console.log(item.name)
        },
        clickTitle(title) {
          console.log(title)
        },
        onPullingUp() {
          // Mock async load.
          setTimeout(() => {
            const length = this.data.length
            if (length < cityData.length) {
              // Update data.
              this.data.push(cityData[length])
            }
            // Call forceUpdate after finishing data load.
            this.$refs.indexList.forceUpdate()
          }, 1000)
        }
      }
    }
    
    • 下拉刷新

    可以通过 pullDownRefresh 属性开启下拉刷新功能,具体配置同 Scroll 组件的 options.pullDownRefresh

    <cube-index-list
      ref="indexList"
      :data="data"
      :title="title"
      :pullDownRefresh="pullDownRefresh"
      @select="selectItem"
      @title-click="clickTitle"
      @pulling-down="onPullingDown">
    </cube-index-list>
    
    export default {
      data() {
        return {
          title: 'Current City: BEIJING',
          data: cityData,
          pullDownRefresh: {
            stop: 55
          }
        }
      },
      methods: {
        selectItem(item) {
          console.log(item.name)
        },
        clickTitle(title) {
          console.log(title)
        },
        onPullingDown() {
          // Mock async load.
          setTimeout(() => {
            // Update data.
            this.data[1].items.push(...cityData[1].items)
            // Call forceUpdate after finishing data load.
            this.$refs.indexList.forceUpdate(true)
          }, 1000)
        }
      }
    }
    

Props 配置

参数 说明 类型 默认值
title 标题 String -
data 需要展示的数据 Array []
navbar 是否需要导航栏 Boolean true
speed 点击导航栏索引时,滚动到相应位置的动画时间(单位:ms) number 0
options1.9.8+ better-scroll 配置项,具体请参考BS 官方文档 Object {
observeDOM: true,
click: true,
probeType: 1,
scrollbar: false,
pullDownRefresh: false,
pullUpLoad: false
}
注意:从1.12.38版本开始,因修复BSiOS13.4版本的滚动问题,useTransition在iOS版本>=13.4时默认为fasle
具体请参考#978
pullUpLoad1.8.0+ 上拉加载,具体配置参考 scroll 组件的 options.pullUpLoad即将废弃,推荐使用 options 属性 Boolean/Object false
pullDownRefresh1.8.0+ 下拉刷新,具体配置参考 scroll 组件的 options.pullDownRefresh即将废弃,推荐使用 options 属性 Boolean/Object false
  • data 子配置项

data 是数组,表示的是一组数据,每一项配置:

参数 说明 类型
name 组名 String
items 当前组下的数据项 Array

items 数组中的每一项必须是对象,且包含 name 属性用于显示内容;例如 items: [{name: 'xx', ...}, ...]

插槽

名字 说明 作用域参数
title1.12.25+ 标题插槽 -
pulldown1.9.4+ 位于列表上方,会在下拉刷新时显示,与 scroll 组件相同 具体参考 scroll 组件的 pulldown 插槽作用域参数介绍
pullup1.9.4+ 位于列表下方,会在上拉加载时显示,与 scroll 组件相同 具体参考 scroll 组件的 pullup 插槽作用域参数介绍

事件

事件名 说明 参数
select 点击 IndexList 的某一项后触发 该选项的数据
title-click 点击 title 后触发(title 必须设置后才有效) title属性值
pulling-up1.8.0+ 当 pullUpLoad 属性为 true 时,在上拉超过阈值时触发 -
pulling-down1.8.0+ 当 pullDownRefresh 属性为 true 时,在下拉超过阈值时触发 -