Swipe 滑块组件

1.5.0 新增

滑块组件,提供类似微信列表左滑功能,可以方便地对列表项做一些功能操作。

示例

Swipe 组件的示例相关代码在这里

  • 基本使用
    Swipe 组件常见的场景是搭配 Scroll 组件使用,既可以纵向滚动,又可以横向左滑出一些按钮对列表项做操作,当然,Swipe 组件也可以单独使用。
  1. <template>
  2. <div class="swipe-wrapper">
  3. <cube-scroll>
  4. <cube-swipe
  5. @item-click="onItemClick"
  6. @btn-click="onBtnClick"
  7. :data="swipeData">
  8. </cube-swipe>
  9. </cube-scroll>
  10. </div>
  11. </template>
  1. export default {
  2. data() {
  3. return {
  4. swipeData: [{
  5. item: {
  6. text: '测试1',
  7. value: 1
  8. },
  9. btns: [
  10. {
  11. action: 'clear',
  12. text: '不再关注',
  13. color: '#c8c7cd'
  14. },
  15. {
  16. action: 'delete',
  17. text: '删除',
  18. color: '#ff3a32'
  19. }
  20. ]
  21. }, {
  22. item: {
  23. text: '测试2',
  24. value: 2
  25. },
  26. btns: [
  27. {
  28. action: 'clear',
  29. text: '不再关注',
  30. color: '#c8c7cd'
  31. },
  32. {
  33. action: 'delete',
  34. text: '删除',
  35. color: '#ff3a32'
  36. }
  37. ]
  38. }, {
  39. item: {
  40. text: '测试3',
  41. value: 3
  42. },
  43. btns: [
  44. {
  45. action: 'clear',
  46. text: '不再关注',
  47. color: '#c8c7cd'
  48. },
  49. {
  50. action: 'delete',
  51. text: '删除',
  52. color: '#ff3a32'
  53. }
  54. ]
  55. }]
  56. }
  57. },
  58. methods: {
  59. onItemClick(item) {
  60. console.log('click item:', item)
  61. },
  62. onBtnClick(btn, index) {
  63. if (btn.action === 'delete') {
  64. this.- createActionSheet({
  65. title: '确认要删除吗',
  66. active: 0,
  67. data: [
  68. {content: '删除'}
  69. ],
  70. onSelect: () => {
  71. this.swipeData.splice(index, 1)
  72. }
  73. }).show()
  74. }
  75. }
  76. }
  77. }

Swipe 组件如果使用默认插槽,则需要传递示例所示的数据结构。

  • 自定义插槽
    实际上我们更常见的需求是需要自定义列表的内容展示,因此 Swipe 组件也支持了插槽的使用方式,如下:
  1. <template>
  2. <div class="swipe-wrapper">
  3. <cube-scroll>
  4. <cube-swipe>
  5. <transition-group name="swipe" tag="ul">
  6. <li class="swipe-item-wrapper" v-for="(data,index) in swipeData" :key="data.item.id">
  7. <cube-swipe-item
  8. ref="swipeItem"
  9. :btns="data.btns"
  10. :index="index"
  11. @btn-click="onBtnClick"
  12. @active="onItemActive">
  13. <div @click="onItemClick(data.item, index)" class="item-inner">
  14. <div class="icon">
  15. <img width="60" height="60" :src="data.item.imgurl">
  16. </div>
  17. <div class="text">
  18. <h2 class="item-name" v-html="data.item.name"></h2>
  19. <p class="item-desc" v-html="data.item.desc"></p>
  20. </div>
  21. </div>
  22. </cube-swipe-item>
  23. </li>
  24. </transition-group>
  25. </cube-swipe>
  26. </cube-scroll>
  27. </div>
  28. </template>
  1. export default {
  2. data() {
  3. return {
  4. swipeData: [
  5. {
  6. item: {
  7. id: '3646653877',
  8. name: '还不是因为你长得不好看',
  9. desc: '伤感:歌词再狠,也抵不过现实伤人',
  10. imgurl: 'http://p.qpic.cn/music_cover/MhQ4bJBPt3Yt5icXyBGNhyPJnE9O51CqaN72iaDgvFmDKaia12UFhU5uQ/600?n=1'
  11. },
  12. btns: [
  13. {
  14. action: 'clear',
  15. text: '不再关注',
  16. color: '#c8c7cd'
  17. },
  18. {
  19. action: 'delete',
  20. text: '删除',
  21. color: '#ff3a32'
  22. }
  23. ]
  24. },
  25. {
  26. item: {
  27. id: '1789676645',
  28. name: '秋水浮萍任飘渺',
  29. desc: '『武侠配乐』快意恩仇江湖情',
  30. imgurl: 'http://p.qpic.cn/music_cover/8KfvDey9cibtZ5xkWxRic6vhXgdPic3wnB7reibI4pdPQBCP8u57uqcjsQ/600?n=1'
  31. },
  32. btns: [
  33. {
  34. action: 'clear',
  35. text: '不再关注',
  36. color: '#c8c7cd'
  37. },
  38. {
  39. action: 'delete',
  40. text: '删除',
  41. color: '#ff3a32'
  42. }
  43. ]
  44. },
  45. {
  46. item: {
  47. id: '3649034125',
  48. name: '念葳蕊',
  49. desc: '江海迦:热恋后哼一首歌为自己悲悯的歌',
  50. imgurl: 'http://p.qpic.cn/music_cover/jXFicBvicUcfIWSoCNT1OrbAoHG2fqqnrJVnGV4iaLCapWUpCKqbmAicJg/600?n=1'
  51. },
  52. btns: [
  53. {
  54. action: 'clear',
  55. text: '不再关注',
  56. color: '#c8c7cd'
  57. },
  58. {
  59. action: 'delete',
  60. text: '删除',
  61. color: '#ff3a32'
  62. }
  63. ]
  64. },
  65. ]
  66. }
  67. },
  68. created() {
  69. this.activeIndex = -1
  70. },
  71. methods: {
  72. onItemClick(item) {
  73. console.log('click item:', item)
  74. },
  75. onBtnClick(btn, index) {
  76. if (btn.action === 'delete') {
  77. this.- createActionSheet({
  78. title: '确认要删除吗',
  79. active: 0,
  80. data: [
  81. {content: '删除'}
  82. ],
  83. onSelect: () => {
  84. this.swipeData.splice(index, 1)
  85. }
  86. }).show()
  87. } else {
  88. this.- refs.swipeItem[index].shrink()
  89. }
  90. },
  91. onItemActive(index) {
  92. if (index === this.activeIndex) {
  93. return
  94. }
  95. if (this.activeIndex !== -1) {
  96. const activeItem = this.- refs.swipeItem[this.activeIndex]
  97. activeItem.shrink()
  98. }
  99. this.activeIndex = index
  100. }
  101. }
  102. }

默认插槽可以搭配 cube-swipe-item 组件实现列表的循环。自定义插槽非常灵活,但它也需要自己手动去写一些逻辑,比如如果你想要在列表删除的时候自定义动画,需要使用 transition-group,需要手动去管理每个激活的 swipe-item 的收缩,如示例代码所示。

Props 配置

  • cube-swipe 配置
参数 说明 类型 可选值 默认值
data 用于 swipe 列表渲染的数据,当需要使用内置的默认插槽,此参数必传,数组的每一项是一个 Object 类型,包括 itembtns,这俩参数见 cube-swipe-item 的描述。如果使用自定义插槽,可不传此值。 Array - []
autoShrink 用于当点击滑块的按钮后,是否需要自动收缩滑块,如果使用自定义插槽,则直接给 cube-swipe-item 传递此值即可。 Boolean - false
  • cube-swipe-item 配置
参数 说明 类型 可选值 默认值
item 用于 swipe-item 列表项渲染的数据,当需要使用内置的默认插槽,此参数必传,且需要有 valuetext 2 个字段,分别表示数据项的值和显示的文案,但如果使用自定义插槽,可不传此值。 Object - {}
btns 用于 swipe-item 列表项渲染按钮数组,数组的每一项是一个 Object 类型,至少要包含 textcolor 2 个字段,分别表示按钮的文案和颜色。 Array - []
index 表示当前的 swpie-item 在整个列表中的索引值,必传。 Number - -1
autoShrink 用于当点击滑块的按钮后,是否需要自动收缩滑块。 Boolean - false

事件

  • cube-swipe 事件

当使用自定义插槽时,直接监听 cube-swipe-item 上的事件即可。

事件名 说明 参数1 参数2 参数3
item-click 当列表项目被点击时派发 点击的列表项 点击项在列表中的索引 -
btn-click 当按钮被点击时派发 点击的按钮 点击按钮在列表中的索引 列表项1.9.7
  • cube-swipe-item 事件
事件名 说明 参数1 参数2
item-click 当列表项目被点击时派发 点击的列表项 点击项在列表中的索引
btn-click 当按钮被点击时派发 点击的按钮 点击按钮在列表中的索引
active 当开始滑动某个列表项目时派发 激活项在列表中的索引 -

实例方法

  • cube-swipe-item 实例方法
方法名 说明
shrink 收缩该滑块项

原文:

https://didi.github.io/cube-ui/#/zh-CN/docs/swipe