(6)学习模块的实现,wxml、wxss、js源代码

这一节我们把学习模块实现出来,并提供wxml、wxss、js源代码。

实现后的效果图:

代码结构图:

一、wxml

<!--pages/xuexizh/xuexizh.wxml-->

<view class='top'>  
    <view class='topLeft'><text style='margin-left:20rpx;'>{{tikuleixing}} {{tikuxuhao}}</text></view>
    <view class='topRight'>
      <view class='topRightContent'>
        <text style='color:#1bd0bd;font-size:50rpx; font-style:italic;margin-right:10rpx;'>{{tihaox}}</text><text> /{{timushu}}                       </text>
      </view>
    </view>
</view>


<view class='timu'>
  <view wx:for="{{jieguo}}" wx:key="item">{{item.tigan}}</view>
</view>

<view class='daan'>
  <view hidden="{{hidden}}">  
    <view wx:for="{{daan}}" wx:key="item">{{item.ans}}</view>
  </view>
</view>

<view class='xuanze'>
  <button disabled="{{predisabled}}"   bindtap='prequestion'>上一题</button>
  <button                              bindtap='showanswer'>显示答案</button>
  <button disabled="{{nextdisabled}}"  bindtap='nextquestion'>下一题</button>
</view>


<view class="tihao">
  <text class="section__title">拖动选题</text>
  <view class="body-view">
    <slider bindchange="sliderchange" min="1" max="{{timushu}}" show-value />
  </view>
</view>

二、wxss

/* pages/xuexizh/xuexizh.wxss */

.top{
  height: 100rpx;
  width: 100%;
  border-bottom: 1px solid #c9c9c9;
}

.topLeft{
  display:flex;
  font-size:35rpx;
  align-items:center;
  float: left;
  width: 50%;
  height: 100%;
}

.topRight{
  display:flex;
  align-items:center;
  float: right;
  width: 50%;
  height: 100%;
}

.topRightContent{
  position: fixed;
  margin-right: 20rpx;
  right: 0;
  text-align: right;
}


.timu{
  color: #060000;
  margin: 30rpx 30rpx 30rpx 30rpx;
  font-size: 40rpx;
  height: 300rpx;
  border-bottom: 1rpx solid #c9c9c9;
  
}

.daan{
  color: #5A5A5A;
  margin: 30rpx 30rpx 30rpx 30rpx;
  font-size: 40rpx;
  height: 100rpx;
  border: 1rpx solid #ffffff;
}

.xuanze{
  display: flex;
  margin-bottom:50rpx;
}

.section__title{
  font-size: 40rpx;
  padding-left:50rpx;
}

.body-view{
  padding-left:50rpx;
  justify-content: center;
  margin-top:50rpx;
  width: 90%;
  
}

三、js

// pages/xuexizh/xuexizh.js
Page({
  
  data: {
    //页面右上角显示选择的题号
    tihaox:1,
   
    jieguo: [{ _id: "W_5E7yfIZl09sR74", ans: "A", tigan: "", tihao: 1 }],
    daan: [{ _id: "W_5E7yfIZl09sR74", ans: "", tigan: "what is a ?", tihao: 1 }],
    
    //页面左上角显示选择的题库
    tikuxianshi:null,

    //页面初次渲染,学习第一题时,上一题button无效状态,下一题有效
    predisabled:true,
    nextdisabled:false,
    hidden:true,

    timushu:null,

    tempt:1,

    tikuleixing:null,
    tikuxuhao:null


  },


 //拖动slider变化所选的题目
 sliderchange:function(e){
    console.log(e.detail.value)
    this.setData({
      tihaox:e.detail.value,
      tempt:e.detail.value
    })
   
   //判断 上一题button按钮,是否可用状态
    if (e.detail.value > 1) {
     this.setData({
       predisabled: false
     })
    }
    else {
     this.setData({
       predisabled: true
     })
    }
   
    //判断 下一题button按钮,是否可用状态
   if (e.detail.value < 200) {
     this.setData({
       nextdisabled: false
     })
   }
   else {
     this.setData({
       nextdisabled: true
     })
   }
     
   this.chaxun(e.detail.value) 
  },


  //chaxun 是实现数据库查询并动态渲染页面的函数,传来的参数是要查询的题号
  chaxun:function(e){
  
   //用wx.getStorage,通过本地缓存进行了页面间传值,传来了所选题库的值
   //toString()方法,把数字转换为字符串
    var tiku = wx.getStorageSync('tikuzhi');
    var tk='gx'+tiku;
    const db = wx.cloud.database()
    var that=this
    db.collection(tk).where({
       //数据库中查询tihao字段等于e.detail.value选择的结果
       tihao:e,
     })
     .get({
      success(res) {
         // res.data 是包含以上定义的记录的数组
        console.log(res.data)
        that.setData({
          //不显示答案
          hidden:true,
          //刷新新查询的题目和答案,上一行代码设置答案暂不显示
          jieguo:res.data,
          daan:res.data
      })
                
       }
    })

  },


  //上下一题、显示答案按钮功能的实现

  //还需要1、判断上一题按钮无效的逻辑,2、检查渲染数据的完备和及时
  prequestion: function (e) {
    var a=this.data.tempt-1;

    if (a > 1) {
      this.setData({
        predisabled: false
      })
    }
    else {
      this.setData({
        predisabled: true
      })
    }

    this.chaxun(a)
    this.setData({
      tihaox: a,
      tempt:a,
      //点击上一题button后,下一题button就应该成为有效状态
      nextdisabled: false
    })
    
    
  },
  
  
  showanswer:function(e){
      this.setData({
        hidden:false
      })
   
  },

  nextquestion:function(e){
       
    //从prequestion函数整体拷过来的,把设置相应的改成符合“下一题”的
    var b = this.data.tempt +1;
    
    //重新查询、渲染下一题
    this.chaxun(b)
    
    //更新右上角题号,更新当前选定的是第几题
    this.setData({
      tihaox: b,
      tempt: b,
      //点击下一题button后,上一题button就应该成为有效状态
      predisabled: false
    })
    
    //控制下一题button的无效状态
    if (b < this.data.timushu) {
      this.setData({
        nextdisabled: false
      })
    }
    else{
      this.setData({
        nextdisabled: true
      })
    }
       
  },

  
  //加的timushu函数,为了动态显示题库的题目数
  timushu: function () {

    var tiku = wx.getStorageSync('tikuzhi').toString();
    var tk = 'gx' + tiku;

    const db = wx.cloud.database()
    var that = this

    db.collection(tk).count({
      success(res) {
        console.log(res.total)
        that.setData({
          timushu: res.total
        })
      }
    })
  },


  onLoad: function (options) {
    var tiku2 = wx.getStorageSync('tikuzhi');
    this.setData({
      tikuxianshi:tiku2
    })
    this.timushu()
    this.chaxun(1)

    var global=getApp()
    this.setData({
      tikuleixing:global.tikuleixing,
      tikuxuhao:global.tikuxuhao
    })
    
    
  },

 
  onReady: function () {

  },

  
  onShow: function () {

  },

  
  onHide: function () {

  },

  
  onUnload: function () {

  },

  
  onPullDownRefresh: function () {

  },

  
  onReachBottom: function () {

  },

  onShareAppMessage: function () {
    return {
      title: '大家一起学',

    }
  }
  
})

四、关于源代码的说明

  1. 左上角显示所处的题库
  2. 右上角斜体的绿色显示当前位于题库的第几题,/右边 显示题库中共有多少道题
  3. 上一题、下一题 两个button因为逻辑的需要,有时应置于无效状态。比如进入页面学习是从第1题开始,页面初次渲染时,上一题button应出于无效状态等等
  4. 显示答案button,控制答案区域的显示
  5. 因为题库中题目可能会比较多,为了在大范围内快速选题,除了用button控件选题之外,我在下面又加了一个slider控件用于拖动选题