index.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // components/loadmore/index.js
  2. const
  3. {
  4. globalData: {
  5. util: {
  6. regeneratorRuntime,
  7. request,
  8. showTip
  9. }
  10. }
  11. } = getApp();
  12. Component({
  13. /**
  14. * 组件的属性列表
  15. */
  16. properties: {
  17. url: String,
  18. data: Object,
  19. page: {
  20. type: Number,
  21. value: 1
  22. },
  23. rows: {
  24. type: Number,
  25. value: 10
  26. },
  27. request: {
  28. type: String,
  29. value: "get"
  30. }
  31. },
  32. data: {
  33. completion: false,
  34. lock: false,
  35. state: false,
  36. },
  37. ready() {
  38. let reload = (param = null) => {
  39. this.setData({
  40. page: 1,
  41. completion: false,
  42. lock: false,
  43. param
  44. })
  45. this._observer && this._observer.disconnect()
  46. this._observer = wx.createIntersectionObserver(this).relativeToViewport()
  47. this._observer.observe('.loadmore', ({
  48. intersectionRatio
  49. }) => this.setData({
  50. state: intersectionRatio > 0
  51. }))
  52. }
  53. this.triggerEvent("reload", {
  54. reload
  55. })
  56. reload()
  57. },
  58. detached() {
  59. this._observer.disconnect();
  60. },
  61. observers: {
  62. state(o) {
  63. o && this.load()
  64. },
  65. completion(completion) {
  66. this.triggerEvent("loadCompletion", { completion })
  67. }
  68. },
  69. methods: {
  70. async load() {
  71. let {
  72. url,
  73. param,
  74. data,
  75. page,
  76. rows,
  77. completion,
  78. lock,
  79. state,
  80. request: req
  81. } = this.data
  82. if (lock || !state) return false
  83. lock = !lock;
  84. let {
  85. items = [],
  86. total = 0,
  87. _err
  88. } = await request[req](url, Object.assign({}, data, param, {
  89. page,
  90. rows
  91. }))
  92. if (_err) {
  93. _err.status && showTip(_err.errmsg || '加载列表失败')
  94. return this.setData({
  95. completion: true
  96. });
  97. }
  98. this.triggerEvent("getItems", {
  99. items
  100. })
  101. if (completion = rows * (page - 1) + items.length >= total) {
  102. this._observer.disconnect();
  103. return this.setData({
  104. completion
  105. })
  106. }
  107. this.setData({
  108. page: ++page
  109. })
  110. lock = !lock;
  111. setTimeout(() => this.load(), 1000)
  112. }
  113. }
  114. })