|
|
- // 简化版列表的混入
- 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()
- }
- }
|