index.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /*
  2. * @description: 小程序左划删除组件
  3. * @Author: bigmeow (https://github.com/bigmeow/minapp-slider-left)
  4. */
  5. 'use strict'
  6. Object.defineProperty(exports, '__esModule', {
  7. value: true
  8. });
  9. exports.default = Component({
  10. properties: {
  11. // 组件的可视宽度设置(rpx)
  12. width: {
  13. type: Number,
  14. value: 750,
  15. },
  16. // 阈值,往左移动超过则显示菜单项,否则隐藏(一般为菜单宽的40%)
  17. moveThreshold: {
  18. type: Number,
  19. value: 30
  20. },
  21. // 可以往左拖动的最大距离,同时它也是组件的初始x坐标,此时菜单不可见
  22. openWidth: {
  23. type: Number,
  24. value: 90
  25. },
  26. butText:{
  27. type: String,
  28. value: '关闭房间'
  29. },
  30. // 菜单是否打开了,true表示打开,false表示关闭
  31. open: {
  32. type: Boolean,
  33. value: false,
  34. observer: function (open) {
  35. this.setData({
  36. x: open ? 0 : this.data.openWidth
  37. })
  38. this.triggerEvent('change', {
  39. open
  40. })
  41. }
  42. }
  43. },
  44. /**
  45. * 组件的初始数据
  46. */
  47. data: {
  48. x: 75, // 单位px
  49. currentX: 75, // 当前记录组件被拖动时的x坐标
  50. moveInstance: 0 // 记录往左移动的距离
  51. },
  52. attached: function () {
  53. this.setData({
  54. x: this.data.open ? 0 : this.data.openWidth
  55. })
  56. },
  57. methods: {
  58. handleChange: function (e) {
  59. const x = e.detail.x
  60. this.data.moveInstance = this.data.openWidth - x
  61. this.data.currentX = x
  62. // console.log(this.data.moveInstance)
  63. },
  64. handleTouchend: function () {
  65. // 如果松开手指的时候,已经被拖拽到最左边或者最右边,则不处理
  66. if (this.data.currentX === 0) {
  67. this.setData({ open: true })
  68. return
  69. }
  70. if (this.data.currentX === this.data.openWidth) {
  71. this.setData({ open: false })
  72. return
  73. }
  74. // 如果当前菜单是打开的,只要往右移动的距离大于0就马上关闭菜单
  75. if (this.data.open && this.data.currentX > 0) {
  76. this.setData({ open: false })
  77. return
  78. }
  79. // 如果当前菜单是关着的,只要往左移动超过阀值就马上打开菜单
  80. if (this.data.moveInstance < this.data.moveThreshold) {
  81. this.setData({
  82. open: false,
  83. x: this.data.openWidth
  84. })
  85. } else {
  86. this.setData({ open: true })
  87. }
  88. },
  89. // 点击删除按钮触发的事件
  90. handleDelete: function () {
  91. this.setData({ open: false })
  92. this.triggerEvent('delete')
  93. },
  94. // 开始左滑时触发(轻触摸的时候也会触发),主要用于显示当前删除按钮前先 隐藏掉其它项的删除按钮
  95. handleTouchestart: function () {
  96. if (!this.data.open) {
  97. this.triggerEvent('sliderLeftStart')
  98. }
  99. }
  100. }
  101. })