refresh.vue 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <template>
  2. <div class="refresh-container">
  3. <van-pull-refresh v-model="isLoading" @refresh="onRefresh">
  4. <van-list v-model="loading" :finished="finished" finished-text="没有更多了" @load="onLoad" style="margin-top:5px">
  5. <slot name="data"></slot>
  6. </van-list>
  7. </van-pull-refresh>
  8. </div>
  9. </template>
  10. <script>
  11. export default {
  12. name: 'Refresh',
  13. data() {
  14. return {
  15. page: 1,
  16. limit: 10,
  17. alist: [],
  18. loading: false, // 是否正在加载下一页数据
  19. finished: false, // 所有数据是否加载完毕
  20. isLoading: false // 是否正在下拉刷新
  21. }
  22. },
  23. created() {
  24. this.getData()
  25. },
  26. methods: {
  27. // 封装获取文章列表数据的方法
  28. async getData(isRefresh) {
  29. await this.$emit('getData', this.page, this.limit, res => {
  30. // 拼接列表数据
  31. if (isRefresh) {
  32. this.isLoading = false
  33. // 下拉刷新
  34. this.alist = res
  35. } else {
  36. this.loading = false
  37. // 上拉加载
  38. this.alist = [...this.alist, ...res]
  39. }
  40. this.$emit('update:list', this.alist)
  41. if (res.length === 0) {
  42. // 证明没有下一页数据了
  43. this.finished = true
  44. }
  45. })
  46. },
  47. // 上拉加载
  48. onLoad() {
  49. this.loading = true
  50. console.log('触发了 load 事件!')
  51. this.page++
  52. this.getData()
  53. },
  54. // 下拉刷新
  55. onRefresh() {
  56. this.isLoading = true
  57. console.log('触发了下拉刷新!')
  58. this.page = 1
  59. this.getData(true)
  60. }
  61. }
  62. }
  63. </script>
  64. <style lang="scss" scoped>
  65. .refresh-container {
  66. padding: 0px 0 10px 0;
  67. }
  68. </style>