微信小程序 “萬利商城”實戰之七: 商品列表頁的展示及編碼實現


前面講了每個微信小程序頁面都包含4個文件, 以首頁為例 ,分別是

index.js, index.json, index.wxml, index.wxss , 先看編碼后的頁面展示效果如下 :

按照頁面編寫順序, 先從index.wxml頁面布局文件開始 ,刪除里面的全部內容, 加入下面的代碼:

<view class="container">
 

<view class="list1" wx:for="{{productList}}" wx:key="produceId">
  <view>
    <image class="image1" src="{{item.imageUrl}}"></image>
  </view>
  <view class="detail1">
    <text>{{item.productName}}</text>
    <text>{{item.price}}</text>
    <text>{{item.originalPrice}}</text>
  </view>
</view>


</view>

接下來我們就來逐個分析,和html中的標簽不同 ,小程序中有一套自己的標簽系統 , 部分標簽和html中的名稱是一樣的 , 用法也基本相同,在小程序中,容器標簽是<view>,它相當於html中的<div>,頁面的排版都由<view>控制完成,<view>可以嵌套,標簽的樣式由 class屬性來定義, 放在index.wxss中,和html中css文件的功能一樣,上面的代碼中 ,

<view class="container"></view>就是最外層的容器 ,如果我們要更改本頁面的背景顏色 , 直接修改container這個樣式中的相關內容就可以了。

<view class="list1" wx:for="{{productList}}" wx:key="produceId"></view>用來循環輸出商品信息。

如果標簽中有wx:for這樣的屬性,表示這個標簽是循環展現的, productList是一個json數組,定義在index.js的data屬性中(下面我們會詳細介紹index.js),

只要是從index.js的data屬性傳遞過來的數據,在index.wxml中使用都要用{{ }}包裹起來 ,這種寫法就是錯誤的 wx:for="productList" ,

wx:key屬性用來指定數組的key是多少, 官方的解釋是指定wx:key后會有更好的性能。 既然 productList是一個json數組

那在循環輸出數據的時候怎么表示數組中的每一項呢?微信小程序約定用item這個關鍵字來表示,

{{item.productName}}就表示輸出該數組項的productName值 , 同時還約定, 如果要顯示數組各項的序號,

用index這個關鍵字來表示,下表從0開始 , 我們將這一行<text>{{item.productName}}</text>改成

<text>{{index}}  {{item.productName}}</text> 就可以看到產品名稱前有0,1,2的序號了。

 

接下來我們在看index.wxss文件的內容 :


.image1
{
  width:300rpx;
  height:300rpx;
}


.list1
{
  border:solid 3rpx #c0c0c0;
  width: 96%;
  display:flex;
  flex-direction: row;
  flex-wrap: wrap;
  margin-top: 20rpx;
  align-content:space-around
}

.detail1
{ 
  display:flex;
  flex-direction: column;
  flex-wrap: wrap;
}

 

image1 , list1 , detail1分別對應index.wxml文件中的三個class 屬性值 , 只有class="container"這個屬性值container沒有看到,

它定義在app.wxss這樣一個全局樣式文件中 , 一些全局性的屬性可以放到app.wxss中去定義 , 避免每個頁面都要去寫,維護起來也方便,

比如每個頁面的背景顏色就可以放在app.wxss中去定義。

前面說過,小程序的像素量度單位是rpx , 不要使用px ,好處是不同的手機即使分辨率不同, 小程序也可以自己去適配,如果寫成px ,

一旦手機的分辨率或大小不同, 頁面格式就會亂掉了。

 

小程序的頁面布局用display:flex;布局模型,如果元素要橫排 ,就用 flex-direction: row; , 豎排 就用 flex-direction: column;

其他在css中的屬性, 如width:300rpx;  height:300rpx;   border:solid 3rpx #c0c0c0;   margin-top: 20rpx;在wxss文件中都可以使用。

 

最后我們來看index.js文件中的內容 :

 1 //index.js
 2 //獲取應用實例
 3 const app = getApp()
 4 
 5 Page({
 6 
 7   data: {
 8     productList: []
 9   },
10  
11 
12   initProductList:function()
13   {
14     var _this=this;
15     wx.request({
16       url: 'http://www.tm.com/webapi/products',
17       data:{},
18       method:'GET',
19       success:function(res){
20         //var productLists=res.data;
21         var productLists=[
22           {'productId':111,'productName':'預發測試黑色11','price':12.9,'originalPrice':22.9,'imageUrl':'../../images/product11.jpg'},
23           {'productId':122,'productName':'預發測試黑色22','price':15.9,'originalPrice':25.9,'imageUrl':'../../images/product22.jpg'},
24           {'productId':133,'productName':'預發測試黑色33','price':18.9,'originalPrice':38.9,'imageUrl':'../../images/product33.jpg'}
25         ];
26         _this.setData({productList:productLists});
27       }
28     })
29 
30   },
31 
32 
33 
34   onLoad: function (options) {
35     this.initProductList();
36   },
37      
38 })

 

每個js頁面的代碼都是從Page( )這個頁面構造函數開始的, 里面的代碼由兩部分組成 ,

  data: {
    productList: []
  },

這一部分用來定義數據 , 凡是index.wxml中需要用到的數據,都應該定義在 data:{ }中,這里productList: []就是定義的一個空數組,

頁面在執行的時候會根據wxml {{ }}的變量名稱到data:{ }中找對應的變量 ,找到后就用變量的值來替換wxml中的變量,

最后將頁面展示展示給用戶。index.wxml中<view class="list1" wx:for="{{productList}}" wx:key="produceId"></view>標簽內的

{{productList}}就對應js文件data屬性中的productList .

 

另一部分就是事件代碼,如:

 1   initProductList:function()
 2   {
 3     var _this=this;
 4     wx.request({
 5       url: 'http://www.tm.com/webapi/products',
 6       data:{},
 7       method:'GET',
 8       success:function(res){
 9         //var productLists=res.data;
10         var productLists=[
11           {'productId':111,'productName':'預發測試黑色11','price':12.9,'originalPrice':22.9,'imageUrl':'../../images/product11.jpg'},
12           {'productId':122,'productName':'預發測試黑色22','price':15.9,'originalPrice':25.9,'imageUrl':'../../images/product22.jpg'},
13           {'productId':133,'productName':'預發測試黑色33','price':18.9,'originalPrice':38.9,'imageUrl':'../../images/product33.jpg'}
14         ];
15         _this.setData({productList:productLists});
16       }
17     })
18 
19   },
20 
21 
22 
23   onLoad: function (options) {
24     this.initProductList();
25   },

 

onLoad: function (options) {}是頁面生命周期函數,在頁面第一次加載的時候自動執行 , 
當我們第一次訪問index.wxml這個頁面的時候,會自動執行index.js文件中的onLoad()函數,在這個函數里,
我們用this.initProductList();的方式調用了initProductList()這個函數,
目的就是將商品數據設置到頁面上供用戶瀏覽。


initProductList:function(){}函數調用了微信小程序的API: wx.request() ,
這個API的作用是到Web服務器上抓取產品數據,各個參數的作用如下 :
url: Web服務器訪問地址
data:傳遞給Web服務器的參數
method:參數傳遞方式是GET還是POST
success:function(res){}成功執行后的回調函數,獲取Web服務器的返回數據用res.data這個屬性得到,如下面的代碼
var productLists = res.data;
這里為了更直觀的體現Web服務器返回的數據, 將上面的代碼注釋起來了, 用的是mock的數據,如下 :
1 var productLists=[
2           {'productId':111,'productName':'預發測試黑色11','price':12.9,'originalPrice':22.9,'imageUrl':'../../images/product11.jpg'},
3           {'productId':122,'productName':'預發測試黑色22','price':15.9,'originalPrice':25.9,'imageUrl':'../../images/product22.jpg'},
4           {'productId':133,'productName':'預發測試黑色33','price':18.9,'originalPrice':38.9,'imageUrl':'../../images/product33.jpg'}
5         ];
 
        

得到 Web服務器的數據后用小程序中內置的setData()函數將數據設置給data:{ }中定義的變量productList,如下:

_this.setData({productList:productLists});
執行完這個行代碼后頁面才會將產品數據展示出來,頁面顯示如下:


注 : 在調用
wx.request({})函數的時候為了演示方便,並沒有去做頁面session驗證和授權,
實際項目中需要加上這一部分 ,具體做法參考前面的章節,已做了詳細說明。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM