| // 简化版列表的混入 | |
| export default { | |
| 	data() { | |
| 		return { | |
| 			list: [], | |
|       pageNo : 1, | |
|       pageSize : 8, | |
|       mixinListApi: '', | |
|       isLoading: false, | |
|       hasMore: true, | |
|       // 额外返回出去的数据 | |
|       extraData: null, | |
|       // 每次更新数据后执行的函数 可以进行数据处理 | |
|       afterUpdateDataFn: function() {}, | |
|       // 每次更新数据前执行的函数, | |
|       beforeUpdateDataFn: function() {}, | |
|       // 混入配置 | |
|       mixinListConfig: { | |
|         // 数据返回的直接路径 | |
|         responsePath: 'result.records', | |
|         // 列表是否需要下拉刷新 | |
|         isPullDownRefresh: true, | |
|         // 列表是否需要上拉加载 | |
|         isReachBottomLoad: true, | |
|         // 额外返回出去的数据的路径 | |
|         extraDataPath: ''  | |
|       } | |
| 		} | |
| 	}, | |
|   computed: { | |
|     // 自定义onShow前会执行的函数 | |
|     mixinFnBeforePageShow() { | |
|       return function() {} | |
|     } | |
|   }, | |
| 	methods: { | |
|     // 获取文件的自定义传参 -- 可以在页面中重写 | |
|     mixinSetParams() { | |
|       return {} | |
|     }, | |
|     // 解析分路径获取嵌套值 | |
|     resolvePath(obj, path) { | |
|       if (path){ | |
|         return path.split('.').reduce((acc, key) => (acc && acc[key] !== undefined ? acc[key] : null), obj) | |
|       }else { | |
|         return obj | |
|       } | |
|     }, | |
|     // 初始化分页 | |
|     initPage(){ | |
|       this.pageNo = 1, | |
|       this.hasMore = true | |
|     }, | |
|     // 获取列表 | |
|     async getList(isRefresh = false) { | |
|       // console.log('本次请求的pageNo和pageSize', this.pageNo, this.pageSize) | |
|  | |
|       if (!this.hasMore) { | |
|         return | |
|       } | |
|       this.isLoading = true | |
|       const apiMethod = this.resolvePath(this.$api, this.mixinListApi) | |
|       if (typeof apiMethod !== 'function') { | |
|         console.log('mixinApi不存在', this.mixinListApi); | |
|         return | |
|       } | |
|       // 每次更新数据前执行的函数 | |
|       if (this.beforeUpdateDataFn) { | |
|         this.beforeUpdateDataFn(this.list) | |
|       } | |
|        | |
|       const res = await apiMethod({ | |
|         pageNo: this.pageNo, | |
|         pageSize: this.pageSize, | |
|         ...this.mixinSetParams() | |
|       }) | |
|       const resData = this.resolvePath(res, this.mixinListConfig.responsePath) || [] | |
|       if (res.code === 200) { | |
|         // 如果没有值了 | |
|         if (!resData.length) { | |
|           this.hasMore = false | |
|           uni.showToast({ | |
|             title: '暂无更多数据', | |
|             icon: 'none' | |
|           }) | |
|         }else { | |
|           this.pageNo++ | |
|         } | |
| 
 | |
|         if (isRefresh ) { | |
|           // 如果是刷新,直接覆盖 | |
|           this.list = resData | |
|            | |
|         } else { | |
|           this.list = [...this.list, ...resData] | |
|         } | |
| 
 | |
|         // 如果有额外数据的路径,刷新后,需要将额外数据也刷新 | |
|         if (this.mixinListConfig.extraDataPath !== '') { | |
|           this.extraData = this.resolvePath(res, this.mixinListConfig.extraDataPath) | |
|         } | |
|       } | |
|       // 每次更新数据后执行的函数 | |
|       if (this.afterUpdateDataFn) { | |
|         this.afterUpdateDataFn(this.list) | |
|       } | |
|       // 如果有在加载中 | |
|       if (this.isLoading) { | |
|         this.isLoading = false | |
|       } | |
|       // 有过有在下拉加载 | |
|       uni.stopPullDownRefresh() | |
|     }, | |
| 	}, | |
|   async onShow() { | |
|     // if (!this.list.length) { | |
|       if (this.mixinFnBeforePageShow) this.mixinFnBeforePageShow() | |
|       this.initPage() | |
|       await this.getList(true) | |
|     // } | |
|   }, | |
|   async onPullDownRefresh() { | |
|     // 在下拉还没结束前 不做任何操作 | |
|     if (this.isLoading) { | |
|       return | |
|     } | |
|     this.initPage() | |
|     await this.getList(true) | |
|   }, | |
|   async onReachBottom() { | |
|     if (this.isLoading) { | |
|       return | |
|     } | |
|     await this.getList() | |
|   } | |
| }
 |