zoukankan      html  css  js  c++  java
  • 微信小程序开发07-列表页面怎么做

    接上文: 微信小程序开发06-一个业务页面的完成

    github地址:https://github.com/yexiaochai/wxdemo

    我们首页功能基本完成,我对比了下实际工作中的需求,完成度有70%以上,如果再花一两天时间,便能跟之前工作做的差不多了,今天我们继续实现一个页面列表,便结束这次的学习,后面几天要出差,所以总结性的文章本周未必能出来,静待下周吧。

    这里考虑demo复杂度,列表页功能完成度也仅仅完成主功能模块,与真实工作完成度对比60%左右吧,于是我们开始愉快的代码,首先是将我们的页面样式实现:

     1 <view class="page-wrapper ">
     2   <view class="bus-list js_bus_list ">
     3     <view data-supplierid="100020" data-key="" class="bus-list-item  ">
     4       <view class="bus-time"> 08:25</view>
     5       <view class="tobooking"> 预订 </view>
     6       <view class="detail">
     7         <view class="detail1">
     8           <view class="start">
     9             <text class="icon-circle s-icon1"></text>东莞市南城汽车客运站</view>
    10           <view class="end">
    11             <text class="icon-circle s-icon2"></text>连州</view>
    12         </view>
    13         <view class="tags">
    14           <view>
    15             <text class="price">¥135</text>
    16           </view>
    17           <view>
    18             <text class="countleft">10张</text>
    19           </view>
    20           <view>
    21             <text class="b-tags js_tags"></text>
    22           </view>
    23         </view>
    24       </view>
    25     </view>
    26   </view>
    27 
    28   <view class="bus-list js_bus_list ">
    29     <view data-supplierid="100020" data-key="" class="bus-list-item  ">
    30       <view class="bus-time"> 08:25</view>
    31       <view class="tobooking"> 预订 </view>
    32       <view class="detail">
    33         <view class="detail1">
    34           <view class="start">
    35             <text class="icon-circle s-icon1"></text>东莞市南城汽车客运站</view>
    36           <view class="end">
    37             <text class="icon-circle s-icon2"></text>连州</view>
    38         </view>
    39         <view class="tags">
    40           <view>
    41             <text class="price">¥135</text>
    42           </view>
    43           <view>
    44             <text class="countleft">10张</text>
    45           </view>
    46           <view>
    47             <text class="b-tags js_tags"></text>
    48           </view>
    49         </view>
    50       </view>
    51     </view>
    52   </view>
    53   <view class="bus-list js_bus_list ">
    54     <view data-supplierid="100020" data-key="" class="bus-list-item  ">
    55       <view class="bus-time"> 08:25</view>
    56       <view class="tobooking"> 预订 </view>
    57       <view class="detail">
    58         <view class="detail1">
    59           <view class="start">
    60             <text class="icon-circle s-icon1"></text>东莞市南城汽车客运站</view>
    61           <view class="end">
    62             <text class="icon-circle s-icon2"></text>连州</view>
    63         </view>
    64         <view class="tags">
    65           <view>
    66             <text class="price">¥135</text>
    67           </view>
    68           <view>
    69             <text class="countleft">10张</text>
    70           </view>
    71           <view>
    72             <text class="b-tags js_tags"></text>
    73           </view>
    74         </view>
    75       </view>
    76     </view>
    77   </view>
    78 
    79   <include src="../mod/calendar.wxml" />
    80   <include src="../../utils/abstract-page.wxml" />
    81 
    82 </view>
    View Code
      1 .page-wrapper {
      2     margin: 0;
      3     font-size: 28rpx;
      4     line-height: 1.5;
      5     color: #333;
      6     background-color: #efefef;
      7     overflow-x: hidden;
      8     -webkit-overflow-scrolling: touch;
      9     -webkit-tap-highlight-color: transparent;
     10     min-height:2000rpx;
     11 }
     12 
     13 .bus-list .bus-list-item {
     14  position: relative;
     15  height: 160rpx;
     16  background-color: #fff; 
     17  margin: 16rpx 0;
     18  border: 2rpx solid #e5e5e5;
     19  border- 2rpx 0;
     20 }
     21 
     22 .bus-list .bus-list-item::before,.bus-list .bus-list-item::after {
     23  position: absolute;
     24  left: 122rpx;
     25  content: '';
     26   24rpx;
     27  height: 12rpx;
     28  background-color: #efefef;
     29  border: 2rpx solid #e5e5e5;
     30 }
     31 
     32 .bus-list .bus-list-item::before {
     33   border-radius: 0 0 60rpx 60rpx;
     34     border-top: none;
     35   top: -2rpx;
     36 }
     37 
     38 .bus-list .bus-list-item::after {
     39   border-radius: 60rpx 60rpx 0 0;
     40     border-bottom: none;
     41   bottom: -2rpx;
     42 }
     43 
     44 .bus-list .bus-list-item .bus-time {
     45  position: absolute;
     46  left: 0;
     47   134rpx;
     48  height: 100rpx;
     49  line-height: 100rpx;
     50  margin: 30rpx 0;
     51  color: #00b358;
     52  text-align: center;
     53  font-size: 40rpx;
     54  font-family: Arial;
     55  border-right: 2rpx dashed #e5e5e5;
     56 }
     57 
     58 .bus-list .bus-list-item .tobooking {
     59  background-color: #00B358;
     60  position: absolute;
     61  right: 0;
     62   120rpx;
     63  height: 160rpx;
     64  line-height: 160rpx;
     65  text-align: center;
     66  color: #fff;
     67  font-size: 30rpx;
     68 }
     69 
     70 .bus-list .bus-list-item.disabled .tobooking {
     71   background-color: #c5c5c5;
     72 }
     73 
     74 .bus-list .bus-list-item .detail {
     75  height: 80rpx;
     76  padding: 36rpx 0;
     77  margin: 0 140rpx 0 144rpx;
     78 }
     79 
     80 .bus-list .bus-list-item .detail  .sub-list{
     81     height: 52rpx;
     82 }
     83 
     84 
     85 .bus-list .bus-list-item .start, .bus-list .bus-list-item .end {
     86  color: #333333;
     87  font-size: 26rpx;
     88  
     89 }
     90 
     91 .bus-list .bus-list-item .price {
     92  font-family: Arial;
     93  color: #fd8f01;
     94  font-size: 32rpx;
     95  font-weight: 600;
     96 }
     97 
     98 .bus-list .bus-list-item.disabled .ticket {
     99  display: none;
    100 }
    101 
    102 .bus-list .bus-list-item .ticket {
    103   color: #fd8f01;
    104   font-size: 24rpx;
    105   border: 2rpx solid #fd8f01;
    106   padding: 2rpx 8rpx;
    107   border-radius: 10rpx;
    108   font-family: Arial;
    109 }
    110 
    111 .bus-list .bus-list-item.disabled .ticket {
    112   color: #c5c5c5;
    113 }
    114 
    115 .bus-list .bus-list-item .s-icon1 {
    116   margin: 0 10rpx;
    117   border-color: #00B358;
    118 }
    119 
    120 .bus-list .bus-list-item .s-icon2 {
    121   margin: 0 10rpx;
    122   border-color: #f06463;
    123 }
    124 
    125 .bus-list .bus-list-item .tags {
    126      160rpx;
    127     text-align: right;
    128     position: absolute;
    129     right: 0;
    130     margin-right: 138rpx;
    131     margin-top: 34rpx;
    132     top: 0;
    133 }
    View Code

    轻轻松松完成了页面主体布局:

    然后这里需求请求数据,所以我们去设置一个请求实体:

     1 class ListModel extends DemoModel {
     2   constructor() {
     3     super();
     4     this.url = '/schedule/list';
     5   }
     6 }
     7 
     8 module.exports = {
     9   cityModel: new CityModel,
    10   city2Model: new City2Model,
    11   listModel: new ListModel
    12 
    13 }

    开始请求参数:

     1 onLoad: function (data) {
     2     let scope = this;
     3 
     4     if(!data || !data.sid || !data.aid || !data.date) {
     5       this.showToast('参数错误');
     6       return
     7     }
     8 
     9     this.index = 0;
    10     let listModel = models.listModel;
    11 
    12     listModel.setParam({
    13       startcityid: data.sid,
    14       arrivalcityid: data.aid,
    15       startdatetime: data.date / 1000,
    16       page: this.index + 1
    17     });
    18 
    19     this.showLoading();
    20     listModel.execute(function(data) {
    21       scope.hideLoading();
    22       scope._appendList(data.schedules);
    23 
    24     });
    25 
    26   }

    接下来的工作便是渲染页面即可,如果不考虑细节,只是做demo,真的很轻易呢:)

     1 //获取公共ui操作类实例
     2 const _page = require('../../utils/abstract-page.js');
     3 let modCalendar = require('../mod/calendar.js');
     4 const models = require('../../data/demo-model.js')
     5 const util = require('../../utils/util.js')
     6 
     7 //获取应用实例
     8 const app = getApp()
     9 
    10 Page(_page.initPage({
    11   data: {
    12     listData: []
    13   },
    14   // methods: uiUtil.getPageMethods(),
    15   methods: {
    16   },
    17 
    18   goIndex: function () {
    19 
    20     wx.navigateTo({
    21       url: '../index/index'
    22     })
    23   },
    24   onShow: function () {
    25     global.sss = this;
    26     let scope = this;
    27   },
    28 
    29   _appendList: function (data) {
    30 
    31     for(let i = 0, len = data.length; i < len; i++) {
    32       data[i].dateStr = util.dateUtil.format(new Date(data[i].datetime * 1000), 'H:F' )
    33     }
    34 
    35     this.setData({
    36       listData: this.data.listData.concat(data)
    37     });
    38   },
    39 
    40   onLoad: function (data) {
    41     let scope = this;
    42 
    43     if(!data || !data.sid || !data.aid || !data.date) {
    44       this.showToast('参数错误');
    45       return
    46     }
    47 
    48     this.index = 0;
    49     let listModel = models.listModel;
    50 
    51     listModel.setParam({
    52       startcityid: data.sid,
    53       arrivalcityid: data.aid,
    54       startdatetime: data.date / 1000,
    55       page: this.index + 1
    56     });
    57 
    58     this.showLoading();
    59     listModel.execute(function(data) {
    60       scope.hideLoading();
    61       scope._appendList(data.schedules);
    62 
    63     });
    64 
    65   }
    66 }, {
    67   modCalendar: modCalendar
    68 }))
    View Code
     1 <view class="page-wrapper ">
     2   <view class="calendar-bar-wrapper js_calendar_wrapper">
     3     <view class="bus-tabs calendar-bar">
     4       <view class="tabs-item js_pre_day">前一天</view>
     5       <view class="tabs-item js_show_calendar" style="-webkit-flex: 2; flex: 2;">2018-8-6 周一(明天)</view>
     6       <view class="tabs-item js_next_day">后一天</view>
     7     </view>
     8   </view>
     9   <view class="bus-list js_bus_list ">
    10 
    11     <block wx:for="{{listData}}" wx:key="k">
    12       <view class="bus-list-item  ">
    13         <view class="bus-time">{{item.dateStr}}</view>
    14         <view class="tobooking"> 预订 </view>
    15         <view class="detail">
    16           <view class="detail1">
    17             <view class="start">
    18               <text class="icon-circle s-icon1"></text>{{item.startstationname}}</view>
    19             <view class="end">
    20               <text class="icon-circle s-icon2"></text>{{item.arrivalstationname}}</view>
    21           </view>
    22           <view class="tags">
    23             <view>
    24               <text class="price">¥{{item.price / 100}}</text>
    25             </view>
    26             <view>
    27               <text class="countleft">{{item.cansellcountamount}}张</text>
    28             </view>
    29             <view>
    30               <text class="b-tags js_tags"></text>
    31             </view>
    32           </view>
    33         </view>
    34       </view>
    35 
    36     </block>
    37 
    38   </view>
    39 
    40   <include src="../mod/calendar.wxml" />
    41   <include src="../../utils/abstract-page.wxml" />
    42 
    43 
    44   <view class="bus-list js_bus_list " ontap="goIndex">
    45     去首页
    46   </view>
    47 </view>
    View Code

    最后,我们完善一下这里日期相关操作,便暂时结束这次学习:

    列表页的一些总结

    我们做小程序相关学习有快两周了,完成了一个简单的demo,项目还是有一定复杂度,感觉上还是比较适合做小程序了解的,但是也有一些问题,比如写到后面事实上更多是业务的东西了,业务会涉及很多细节体验,需要耗时费力,比如今天的列表业务,显然就偷懒了,代码质量也没怎么关注,事实上大家可以思考一些问题,这里还差很多功能:

    ① 滚动加载

    ② 列表各种状态

    ③ ......

    事实上,列表页是常用的一种业务页面,虽然各种列表页的筛选条件不一样,但是主体功能无非都是:

    ① 列表渲染

    ② 滚动加载

    ③ 条件筛选、重新渲染

    所以说我们其实可以将其做成一个页面基类,跟abstract-page一个意思,这里留待我们下次来处理吧,借此我们微信小程序的学习教程就此结束,我后面几天总结下前面所学整理一个博客出来,帮助各位更好的了解 

  • 相关阅读:
    sizeof
    {面试题10: 二进制中1的个数}
    {面试题9: 斐波那契数列}
    gcc常用选项
    mount.nfs: access denied by server while mounting localhost:/home/xuwq/minilinux/system
    ubuntu bash提示找不到文件或目录
    linux 编译内核[scripts/kconfig/dochecklxdialog] 错误
    最简单的抓包程序
    linux命令行解析函数介绍
    逻辑地址到线性地址的转换
  • 原文地址:https://www.cnblogs.com/yexiaochai/p/9431816.html
Copyright © 2011-2022 走看看