1. 程式人生 > >微信小程式(看文件寫例項三)微信小程式課堂寶APP實現整體介面框架及首頁佈局

微信小程式(看文件寫例項三)微信小程式課堂寶APP實現整體介面框架及首頁佈局

一、首頁佈局簡單思路

回顧上一篇博文,首頁的內容主要有輪播圖,橫向滑動選單以及選單對應的view,橫向滑動選單有簽到、課堂測試、模擬測試、課堂提問、答問記錄五個選項,當點選選項時更新顯示view。由於素材和時間有限,所以佈局做得相對簡單,主要是側重思路及程式碼邏輯。

二、輪播圖

檢視文件,發現輪播圖使用的是swiper元件,swiper有以下屬性:

屬性名 型別 預設值 說明 最低版本
indicator-dots Boolean false 是否顯示面板指示點  
indicator-color Color rgba(0, 0, 0, .3) 指示點顏色 1.1.0
indicator-active-color Color #000000 當前選中的指示點顏色 1.1.0
autoplay Boolean false 是否自動切換  
current Number 0 當前所在頁面的 index  
interval Number 5000 自動切換時間間隔  
duration Number 500 滑動動畫時長  
circular Boolean false 是否採用銜接滑動  
vertical Boolean false 滑動方向是否為縱向  
bindchange EventHandle   current 改變時會觸發 change 事件,event.detail = {current: current, source: source}  

那就可以定義一個swiper,樣式指定高,寬鋪滿,swiper裡的image元件圖片100%顯示就能鋪滿螢幕。還有一點,輪播圖是從伺服器請求的,那應當用一個block去迴圈請求到的url列表來設定swiper-item裡頭的image元件,然後遍歷在前臺顯示。前臺的程式碼如下:

<view class='section'>

<swiper indicator-dots="true" autoplay="true" interval="3000" duration="1000" class='swiper'>

<block wx:for="{{vedioImgUrls}}" wx:key="*this">

<swiper-item id="{{index}}" catchtap="swiperItemClick" >

<image src="{{item.thumbnail.url}}" />

</swiper-item>

</block>

</swiper>

</view>

樣式程式碼:

/* 輪播樣式 */

.swiper{

width: 100%;

height: 240px;

}

/* 輪播圖片樣式 */

.swiper swiper-item image{

width: 100%;

}

當然,現在是空的資料,顯示不了啥,因為並沒有從伺服器獲取資料,先指定一個本地圖片上海交大計算機網路課程的縮圖,效果如下:

三、橫向滑動選單

檢視文件,滑動元件就是scroll-view,scroll-view有比較多的屬性,常用屬性就是scroll-x和scroll-y:

屬性名 型別 預設值 說明
scroll-x Boolean false 允許橫向滾動
scroll-y Boolean false 允許縱向滾動
upper-threshold Number 50 距頂部/左邊多遠時(單位px),觸發 scrolltoupper 事件
lower-threshold Number 50 距底部/右邊多遠時(單位px),觸發 scrolltolower 事件
scroll-top Number   設定豎向滾動條位置
scroll-left Number   設定橫向滾動條位置
scroll-into-view String   值應為某子元素id(id不能以數字開頭)。設定哪個方向可滾動,則在哪個方向滾動到該元素
scroll-with-animation Boolean false 在設定滾動條位置時使用動畫過渡
enable-back-to-top Boolean false iOS點選頂部狀態列、安卓雙擊標題欄時,滾動條返回頂部,只支援豎向
bindscrolltoupper EventHandle   滾動到頂部/左邊,會觸發 scrolltoupper 事件
bindscrolltolower EventHandle   滾動到底部/右邊,會觸發 scrolltolower 事件
bindscroll EventHandle   滾動時觸發,event.detail = {scrollLeft, scrollTop, scrollHeight, scrollWidth, deltaX, deltaY}

於是思路就是給一個scroll-view設定scroll-x屬性為true,然後scroll-view裡頭有五個選單label,這裡說下label是可以把幾個元件合併的,在點選事件的使用有意想不到的效果,於是得到前臺程式碼如下:

<view class='section'>

<scroll-view class="categories" scroll-x="true">

<block wx:for="{{selectedScrollItems}}" wx:key="*this">

<label class="category" id="{{index}}" bindtap='scrollMenuClick'>

<view wx:if="{{menuIndex==index}}" style='color:green; font-size: 18px;'>{{item}}</view>

<view wx:else style='color:royalblue;'>{{item}}</view>

</label>

</block>

</scroll-view>

</view>

樣式程式碼:

/* 滑動選單樣式 */

.categories {

height: 40px;

line-height: 40px;

border: 1px solid #eee;

white-space: nowrap;

display: flex;

}

/* 滑動選單item樣式 */

.categories .category {

width: 80px;

height: 40px;

text-align: center;

display: inline-block;

border-right: 1px solid #eee;

color: royalblue;

font-size: 15px;

}

效果如下:

四、子選單對應view

首先,需求是點選選項顯示不同的介面,那麼思路就可以這樣:設計5個view,點到誰誰顯示其他隱藏就好。那麼邏輯就是在前臺寫五個view,後臺寫五個view對應的標記,當選中時該對應標記為true,前臺根據這個標記去判定是否渲染,於是得到前臺程式碼如下:

<view class='section' hidden='{{selectedScrollItemsHiddenSign[0]}}'>

簽到

</view>

 

<view class='section' hidden='{{selectedScrollItemsHiddenSign[1]}}'>

課堂測試

</view>

 

<view class='section' hidden='{{selectedScrollItemsHiddenSign[2]}}'>

模擬測試

</view>

 

<view class='section' hidden='{{selectedScrollItemsHiddenSign[3]}}'>

課堂提問

</view>

 

<view class='section' hidden='{{selectedScrollItemsHiddenSign[4]}}'>

答問記錄

</view>

後臺程式碼:

data{

// 選單選項

selectedScrollItems: ['簽到', '課堂測試', '模擬測試', '課堂提問', '答問記錄'],

// 選單選項隱藏和顯示標誌

selectedScrollItemsHiddenSign: [false, true, true, true, true]

}

在scroll-view繫結的scrollMenuClick事件裡頭程式碼如下:

scrollMenuClick:function(e){

// 隱藏其他頁面並顯示當前點選的選單頁面

for (var i = 0; i < this.data.selectedScrollItemsHiddenSign.length;i++){

if (i == e.currentTarget.id) this.data.selectedScrollItemsHiddenSign[i] = false;

else this.data.selectedScrollItemsHiddenSign[i] = true;

}

this.setData({ menuIndex: e.currentTarget.id, selectedScrollItemsHiddenSign: this.data.selectedScrollItemsHiddenSign});

// 顯示載入logo

wx.showToast({

title: '載入中',

icon: 'loading',

duration:10000

});

 

// 選中第一個選單

if (e.currentTarget.id == 0){

setTimeout(function () {

wx.hideToast()

}, 3000);

}// 選中第二個選單,載入課堂測試題

else if (e.currentTarget.id == 1){

setTimeout(function () {

wx.hideToast()

}, 3000);

}

// 選中第三個選單

else if (e.currentTarget.id == 2) {

setTimeout(function () {

wx.hideToast()

}, 3000);

}

// 選中第四個選單

else if (e.currentTarget.id == 3) {

setTimeout(function () {

wx.hideToast()

}, 3000);

}

// 選中最後一個選單

else {

setTimeout(function () {

wx.hideToast()

}, 3000);

}

}

效果:

五、設定tabBar

如果我們的小程式是一個多 tab 應用(客戶端視窗的底部有tab欄可以切換頁面),那麼我們可以通過 tabBar 配置項指定 tab 欄的表現,以及 tab 切換時顯示的對應頁面。

Tip:

1. 當設定 position 為 top 時,將不會顯示 icon

2. tabBar 是一個數組,只能配置最少2個、最多5個 tab,tab 按陣列的順序排序。

具體屬性如下:

屬性 型別 必填 預設值 描述
color HexColor   tab 上的文字預設顏色
selectedColor HexColor   tab 上的文字選中時的顏色
backgroundColor HexColor   tab 的背景色
borderStyle String black tabbar上邊框的顏色, 僅支援 black/white
list Array   tab 的列表,詳見 list 屬性說明,最少2個、最多5個 tab
position String bottom 可選值 bottom、top

其中 list 接受一個數組,陣列中的每個項都是一個物件,其屬性值如下:

屬性 型別 必填 說明
pagePath String 頁面路徑,必須在 pages 中先定義
text String tab 上按鈕文字
iconPath String 圖片路徑,icon 大小限制為40kb,建議尺寸為 81px * 81px,當 postion 為 top 時,此引數無效
selectedIconPath String 選中時的圖片路徑,icon 大小限制為40kb,建議尺寸為 81px * 81px ,當 postion 為 top 時,此引數無效

於是,結合我們上一篇的需求,製作tabBar需要三個頁面即三個page,因此app.json配置如下:

{

"pages": [

"pages/main/main",

"pages/post/post",

"pages/mine/mine",

"pages/vedioPlayer/vedioPlayer",

"pages/start/start"

],

"window": {

"navigationBarTextStyle": "white",

"navigationBarBackgroundColor": "#118fff",

"navigationBarTitleText": "課堂寶",

"backgroundColor": "#fff"

},

"tabBar": {

"color": "#9BABBA",

"selectedColor": "#495056",

"borderStyle": "black",

"backgroundColor": "dark",

"list": [

{

"pagePath": "pages/main/main",

"text": "首頁",

"iconPath": "static/images/tar-home.png",

"selectedIconPath": "static/images/tar-home-on.png"

},

{

"pagePath": "pages/post/post",

"text": "習題",

"iconPath": "static/sources/發帖32x32.png",

"selectedIconPath": "static/sources/發帖32x32hl.png"

},

{

"pagePath": "pages/mine/mine",

"text": "我的",

"iconPath": "static/sources/我的32x32.png",

"selectedIconPath": "static/sources/我的32x32hl.png"

}

]

},

"networkTimeout": {

"request": 10000,

"downloadFile": 10000

}

}

於是就得到介面效果如下:

下一篇將會寫到簽到子頁面的佈局及連線伺服器獲得視訊資訊並載入播放等。