发新帖

[uni-app] unicloud-db前端组件-分页列表

零下一度 2022-7-1 1144


列表分页

unicloud-db组件简化了列表分页的写法,只需简单的配置每页需要多少数据(默认是20条),不管是数据库的分页查询还是前端的列表分页展示,都自动封装了。

列表分页有2种模式,一种是手机上常见的拉到底部加载下一页,另一种是pc常见的底部列出页码,点击页码跳转页面。

列表分页模式1:拉到底部加载下一页。此时下一页的查询结果会追加合并到data里,列表一直在增长。

下面的示例代码没有使用uList组件,实际开发时建议使用uList组件来避免长列表的性能问题。

<template>
  <view class="content">
    <unicloud-db ref="udb" v-slot:default="{data, pagination, loading, error, options}"
      :options="options"
      collection="table1"
      orderby="createTime desc"
      field="name,subType,createTime"
      :getone="false"
      :action="action"
      :where="where"
      @load="onqueryload" @error="onqueryerror">
      <view v-if="error" class="error">{{error.message}}</view>
      <view v-else class="list">
        <view v-for="(item, index) in data" :key="index" class="list-item">
		      {{item.name}}
          <!-- 使用日期格式化组件,详情见插件 https://ext.dcloud.net.cn/search?q=date-format -->
          <uni-dateformat :date="item.createTime" />
        </view>
      </view>
      <view v-if="loading" class="loading">加载中...</view>
    </unicloud-db>
  </view>
</template>
<script>
  export default {
    data() {
      return {
        options: {}, // 插槽不能访问外面的数据,通过此参数传递, 不支持传递函数
        action: '',
        where: {} // 类型为对象或字符串
      }
    },
    onPullDownRefresh() { //下拉刷新
      this.$refs.udb.loadData({
        clear: true //可选参数,是否清空数据
      }, () => {
        uni.stopPullDownRefresh()
      })
    },
    onReachBottom() { //滚动到底翻页
      this.$refs.udb.loadMore()
    },
    methods: {
      onqueryload(data, ended) {
		    // 可在此处预处理数据,然后再渲染界面
      },
      onqueryerror(e) {
        // 加载数据失败
      }
    }
  }
</script>
<style>
  .content {
    display: flex;
    flex-direction: column;
    background-color: #f0f0f0;
  }
  .list-item {
    background-color: #fff;
    margin-bottom: 1px;
    padding: 30px 15px;
  }
  .loading {
    padding: 20px;
    text-align: center;
  }
  .error {
    color: #DD524D;
  }
</style>


列表分页模式2:使用分页控件,点击第二页则只显示第二页数据,第一页数据清空。data会重置为下一页的查询结果,上一页数据丢弃

<template>
  <view class="content">
    <unicloud-db ref="udb" v-slot:default="{data, pagination, loading, error, options}"
      :options="options"
      collection="table1"
      orderby="createTime desc"
      field="name,subType,createTime"
      :getcount="true"
      @load="onqueryload" @error="onqueryerror">
      <view>{{pagination}}</view>
      <view v-if="error" class="error">{{error.errMsg}}</view>
      <view v-else class="list">
        <view v-for="(item, index) in data" :key="index" class="list-item">
		  {{item.name}}
          <!-- 使用日期格式化组件,详情见插件 https://ext.dcloud.net.cn/search?q=date-format -->
          <uni-dateformat :date="item.createTime" />
        </view>
      </view>
      <view class="loading" v-if="loading">加载中...</view>
      <!-- 分页组件 -->
      <uni-pagination show-icon :page-size="pagination.size" total="pagination.count" @change="onpagination" />
    </unicloud-db>
  </view>
</template>
<script>
  export default {
    data() {
      return {
        options: {}, // 插槽不能访问外面的数据,通过此参数传递, 不支持传递函数
      }
    },
    onPullDownRefresh() { //下拉刷新(一般此场景下不使用下拉刷新)
      this.$refs.udb.loadData({
        clear: true
      }, () => {
        uni.stopPullDownRefresh()
      })
    },
    methods: {
      onqueryload(data, ended) {
		// 可在此处预处理数据,然后再渲染界面
      },
      onqueryerror(e) {
        // 加载数据失败
      },
      onpagination(e) {
        this.$refs.udb.loadData({
          current: e.current
        })
      }
    }
  }
</script>
<style>
  .content {
    display: flex;
    flex-direction: column;
    background-color: #f0f0f0;
  }
  .list-item {
    background-color: #fff;
    margin-bottom: 1px;
    padding: 30px 15px;
  }
  .loading {
    padding: 20px;
    text-align: center;
  }
  .error {
    color: #DD524D;
  }
</style>


转载:https://uniapp.dcloud.io/uniCloud/unicloud-db.html#page


最新回复 (0)
返回
零下一度
主题数
931
帖子数
0
注册排名
1