當(dāng)前位置:首頁 > IT技術(shù) > 微信平臺 > 正文

02 小程序入門實戰(zhàn)
2021-07-30 12:06:43

技術(shù)交流QQ群:1027579432,歡迎你的加入!

?

1.創(chuàng)建項目和目錄文件結(jié)構(gòu)

  • 小程序包含一個描述整體程序的app和多個描述各自頁面的page。
  • 一個小程序主體部分由三個文件組成,必須放在項目的根目錄,如下:
    02 小程序入門實戰(zhàn)_微信開發(fā)
  • 一個小程序頁面由四個文件組成,如下圖所示:
    02 小程序入門實戰(zhàn)_微信開發(fā)_02
  • 注意:為了方便開發(fā)者減少配置項,描述頁面的四個文件必須具有相同的路徑與文件名。
  • 由于一個小程序可能有多個頁面,所以在根目錄下創(chuàng)建pages文件夾。假設(shè)小程序僅有一個詳情頁面about,因此為了便于管理在pages文件夾下創(chuàng)建about文件夾。里面新建4個與小程序頁面相關(guān)的文件:about.js、about.json、about.wxml、about.wxss。同時,在根目錄下創(chuàng)建小程序全局相關(guān)文件app.js、app.json、app.wxss。
  • 注意:app.json和about.json配置文件不能什么也不寫,否則會報錯。因此,需要寫入如下內(nèi)容:
    // app.json文件內(nèi)容,路徑必須寫相對路徑
    {
    "pages": ["pages/about/about"]   // 配置小程序需要訪問的所有頁面路徑
    }
    
    // about.json文件內(nèi)容
    {
        navigationBarTitleText": "關(guān)于"
    }
    
  • 接著,在app.js文件中,最簡單的方法是注冊一個空的頁面對象。添加如下內(nèi)容:
    Page({})
    

02 小程序入門實戰(zhàn)_微信開發(fā)_03

2.view、text、image組件(元素)

  • 所有的wxml組件元素都是既有開始標(biāo)記又有結(jié)束標(biāo)記。都是雙標(biāo)簽!
  • view組件元素相當(dāng)于HTML中的div元素。
    <view class="container">
        <image src="../../images/curry.jpg" class="about-banner"></image>
        <text>電影周周看</text>
        <text>我每周推薦一部好電影</text>
        <text>我的微博:weibo.com/CurryCoder</text>
    </view>
    

3.快速實現(xiàn)基本布局

  • 傳統(tǒng)方式:相關(guān)的wxss屬性賦值非常分散。
    /* 傳統(tǒng)方式 */
    .container {
    background-color: #eee;
    height: 100vh;
    text-align: center;
    }
    
    text {
    display: block;
    }
    
    image, text {
    margin-bottom: 60px;
    }
    
  • 彈性布局方式:相關(guān)的wxss屬性賦值比較統(tǒng)一,方式靈活。
    /* flex彈性布局方式 */
    .container {
    background-color: #eee;
    height: 100vh;
    display: flex;
    /* 修改主軸 */
    flex-direction: column;  
    justify-content: space-around;
    align-items: center;
    }
    

4.響應(yīng)式長度單位rpx

  • 問題的引入:如何讓元素大小適配不同寬度屏幕?使用px這種絕對長度單位無法始終保持圖片寬度和高度為屏幕的一半。
  • 小程序規(guī)定所有設(shè)備的屏幕寬高均為750rpx。
    .about-banner {
    width: 375rpx;
    height: 375rpx;
    }
    
  • iPhone6的屏幕尺寸為375px*667px,而小程序規(guī)定所有設(shè)備的屏幕的寬高均為750rpx。因此,兩者寬度的關(guān)系剛好是1:2關(guān)系(即px:rpx=1:2),便于換算。
    /* 例如,在視覺設(shè)計稿中規(guī)定margin-left屬性設(shè)置為100px,則在css中可以寫成200rpx */
    .about-banner {
    width: 375rpx;
    height: 375rpx;
    margin-left: 200rpx;
    }
    

5.新增每周推薦頁面weekly

  • 與詳情頁about類似,在pages目錄下創(chuàng)建weekly文件夾。其中,創(chuàng)建weekly.js、weekly.wxss、weekly.wxml、weekly.json這四個文件。
  • 每一個用戶可能訪問到的頁面,都需要在全局配置中來登記它的訪問路徑。在全局配置文件app.json中寫入如下內(nèi)容。注意:要將weekly頁面的路徑寫在最前面,這樣小程序會最先加載它!
    {
        "pages": ["pages/weekly/weekly", "pages/about/about"]
    }
    
  • 在weekly.js文件中,寫入最簡單的注冊空的頁面對象。
    Page({})
    
  • 在視圖文件weekly.wxml中寫入如下代碼:
    <view>
    <text>本周推薦</text>
    <image src="../../images/curry.jpg"></image>
    <text>庫里</text>
    <text>點評:最牛逼的三分投手,最萌的庫日天。</text>
    </view>
    
  • 在布局文件weekly.wxss中寫入如下內(nèi)容:
    <view class="container">
    <text>本周推薦</text>
    <image src="../../images/curry.jpg"></image>
    <text>庫里</text>
    <text>點評:最牛逼的三分投手,最萌的庫日天。</text>
    </view>
    
  • 我們發(fā)現(xiàn)頁面布局在weekly頁面并沒有生效,所以,可以將weekly和about頁面中共同的樣式放入全局樣式文件app.wxss中。如下所示:
    /* flex彈性布局方式 */
    .container {
    background-color: #eee;
    height: 100vh;
    display: flex;
    /* 修改主軸方向 */
    flex-direction: column;  
    justify-content: space-around;
    align-items: center;
    }
    
  • 在weekly.json文件中,寫入如下內(nèi)容,設(shè)置頁面的標(biāo)題。
    {
    "navigationBarTitleText": "人物介紹"
    }
    

6.使用navigator組件實現(xiàn)從about頁面跳轉(zhuǎn)到weekly頁面

  • 通過將about頁面的路徑作為第一個路徑頁登記,這樣就恢復(fù)成了小程序的初始頁面。
    {
    "pages": [
        "pages/about/about",
        "pages/weekly/weekly"
    ]
    }
    
  • 修改about.wxml文件中的內(nèi)容,增加navigator組件(行內(nèi)元素)。text組件中只能包含文本信息,為了使顯示的信息在同一行中顯示,需要用view組件包含。
    <view class="container">
    <image src="../../images/curry.jpg" class="about-banner"></image>
    <text style="font-weight: blod; font-size: 40rpx">NBA人物周周看</text>
    <view>
    <navigator url="/pages/weekly/weekly" style="display: inline;" open-type="redirect" hover-class="nav-hover" class="nav-default">每周推薦</navigator>
    <text>一個NBA球員</text>
    </view>
    <text>我的微博:weibo.com/CurryCoder</text>
    </view>
    
  • navigator組件中有一個重要的屬性open-type。默認(rèn)值是navigate,當(dāng)設(shè)置為redirect時,表示一般頁面發(fā)生跳轉(zhuǎn)后,無法點擊頁面左上角的返回按鈕進(jìn)行返回。
  • navigator組件中有一個重要的點擊態(tài)屬性hover-class。當(dāng)鼠標(biāo)點擊時,會出現(xiàn)鼠標(biāo)點擊后的效果。在about.wxss文件中加入樣式。
    .nav-hover {
        color: red;
    }
    
  • 使用hover-class時的注意點:當(dāng)鼠標(biāo)點擊導(dǎo)航鏈接前,就已經(jīng)給導(dǎo)航鏈接設(shè)置初始樣式為藍(lán)色。當(dāng)鼠標(biāo)點擊時,會發(fā)現(xiàn)導(dǎo)航鏈接并沒有變?yōu)榧t色。這是因為點擊導(dǎo)航鏈接時,會將nav-hover賦值為class屬性。而在css中,權(quán)重值相同時,會發(fā)生覆蓋現(xiàn)象(就近原則)。因此,在css中需要將.nav-hover的樣式寫在.nav-default之后即可解決上面的問題。
    .nav-default {
        color: blue;
    }
    

7.配置tabBar[標(biāo)簽欄]——對若干一級頁面的入口鏈接

  • 很多時候,對于about和weekly這樣的一階頁,我們希望實現(xiàn)的是在它們之間的快速的任意切換。
  • 在全局配置文件app.json中配置tabBar屬性,如下所示:
    {
    "pages": [
        "pages/about/about",
        "pages/weekly/weekly"
    ],
    "tabBar": {
        "list": [
        {
            "text": "每周推薦",
            "pagePath": "pages/weekly/weekly",
            "iconPath": "images/icons/weekly.png",
            "selectedIconPath": "images/icons/weekly-selected.png"
        },
        {
            "text": "關(guān)于",
            "pagePath": "pages/about/about",
            "iconPath": "images/icons/index.png",
            "selectedIconPath": "images/icons/index-selected.png"
        }
        ],
        "color": "#000",
        "selectedColor": "#00f"
    }
    }
    
  • 新的問題:點擊導(dǎo)航鏈接時,頁面無法實現(xiàn)跳轉(zhuǎn)。原因是:全局配置文件app.json中的list參數(shù)已經(jīng)加載了pagePath,但是tabBar還增加了標(biāo)簽欄。因此,我們在進(jìn)行鼠標(biāo)點擊時,不能僅僅考慮頁面的跳轉(zhuǎn),還要考慮tabBar標(biāo)簽欄的跳轉(zhuǎn)。因此,需要在about.wxml文件中,修改navigator組件中的open-type為switchTab。
    <view class="container">
        <image src="../../images/curry.jpg" class="about-banner"></image>
        <text style="font-weight: blod; font-size: 40rpx">NBA人物周周看</text>
    <view>
        <navigator url="/pages/weekly/weekly" style="display: inline;" open-type="switchTab" hover-class="nav-hover" class="nav-default">每周推薦</navigator>
        <text>一個NBA球員</text>
    </view>
        <text>我的微博:weibo.com/CurryCoder</text>
    </view>
    

8.配置全局的頂部導(dǎo)航欄樣式

  • 原先的about頁面頂部導(dǎo)航欄默認(rèn)是黑色背景,黑字??梢栽赼bout.json文件中修改為黑字,白色背景。
    {
    "navigationBarTitleText": "關(guān)于",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTextStyle": "black"
    }
    
  • 同時,為了使weekly頁面的頂部導(dǎo)航欄樣式與about頁面頂部導(dǎo)航欄樣式一樣,因此,可以復(fù)制上面的代碼到weekly.json文件中。
    {
    "navigationBarTitleText": "人物介紹",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTextStyle": "black"
    }
    
  • 但是,以上代碼直接復(fù)制的方法,必然會帶來代碼升級時的問題。因此,必須在全局配置文件app.json文件中寫入window屬性進(jìn)行設(shè)置。
    {
    "pages": [
        "pages/about/about",
        "pages/weekly/weekly"
    ],
    "tabBar": {
        "list": [
        {
            "text": "每周推薦",
            "pagePath": "pages/weekly/weekly",
            "iconPath": "images/icons/weekly.png",
            "selectedIconPath": "images/icons/weekly-selected.png"
        },
        {
            "text": "關(guān)于",
            "pagePath": "pages/about/about",
            "iconPath": "images/icons/index.png",
            "selectedIconPath": "images/icons/index-selected.png"
        }
        ],
        "color": "#000",
        "selectedColor": "#00f"
    },
    "window": {
        "navigationBarBackgroundColor": "#fff",
        "navigationBarTextStyle": "black",
        "navigationBarTitleText": "NBA人物周周看"   # 某個頁面默認(rèn)的頂部導(dǎo)航欄標(biāo)題,如果某個頁面沒有單獨設(shè)置此屬性,就用全局配置文件中的
    }
    }
    

9.數(shù)據(jù)綁定

9.1 基于DOM API手動更新視圖的傳統(tǒng)方法
  • 在之前講到的about.wxml和weekly.wxml視圖文件中,相關(guān)的數(shù)據(jù)都是進(jìn)行直接硬編碼。直接硬編碼對一些數(shù)據(jù)不變頻繁發(fā)生變化的頁面(如about頁面)是合適的。但是,對于像weekly頁面中大量的數(shù)據(jù)是頻繁變化的需要是不合適的。
  • 直接硬編碼weekly頁面中的數(shù)據(jù),在weekly.wxml文件是無法提前獲知的。需要在小程序運行的過程中,動態(tài)的從服務(wù)器端去獲取,然后再渲染輸出到這個weekly.wxml視圖中進(jìn)行顯示。
  • 傳統(tǒng)方式解決上述直接硬編碼問題:一般來說,會在頁面加載的過程中,通過一個Ajax調(diào)用來請求server返回本周推薦球員的詳細(xì)信息。假設(shè)客戶端收到了服務(wù)端返回的一個javascript對象,如下所示:
    var thisWeekMoive = {
        name: "Stephen Curry",
        comment: "最牛逼的三分投手,最萌的庫日天",
        imagePath: "/images/fd.jpg"
    }
    
  • 接下來,通過如下的賦值語句,將javascript對象中的name、comment、imagePath作為id為t001的text元素的內(nèi)容進(jìn)行設(shè)置。
    document.getElementById("t001").innerHTML = thisWeekMovie.name;
    
  • 傳統(tǒng)方法的缺點
    • 傳統(tǒng)方法需要我們在收到數(shù)據(jù)后,或者說每次這個數(shù)據(jù)被更新的時候,我們都需要執(zhí)行上面的一段代碼來對這個視圖進(jìn)行更新。
    • 其次,上面這樣一段代碼它的維護(hù)是比較困難的。更新視圖中數(shù)據(jù)的代碼與頁面代碼緊耦合,不利于后期頁面的重新布局。
9.2 數(shù)據(jù)綁定(data binding)
  • 我們應(yīng)該有一種機(jī)制能夠讓視圖中的每一個部分與對應(yīng)的數(shù)據(jù)做一個映射,即數(shù)據(jù)綁定。
  • 在小程序框架中,每個頁面所需要的數(shù)據(jù),都是集中在這個頁面所注冊的頁面對象PageObject中所定義的。因此,我們打開weekly這個頁面所注冊的頁面對象所在的文件weekly.js。寫入如下內(nèi)容:
    Page({
    data: {
        thisWeekMoive: {
        name: "Stephen Curry",
        comment: "最牛逼的三分投手,最萌的庫日天",
        imagePath: "/images/fd.jpg"
        },
        count: 123
    }
    })
    
  • 接下來要把count的值渲染輸出到weekly.wxml視圖上顯示,我們通過一個雙大括號進(jìn)行基本的數(shù)據(jù)綁定。
    <view class="container">
        <text>本周推薦</text>
        <image src="../../images/fd.jpg"></image>
        <text>庫里</text>
        <text>點評:最牛逼的三分投手,最萌的庫日天。</text>
        <text>{{count}}</text>   // 數(shù)據(jù)綁定
    </view>
    
  • 我們還可以對內(nèi)部狀態(tài)變量進(jìn)行一些運算或者說對它們進(jìn)行一些組合來進(jìn)行輸出顯示。在weekly.js中再定義一個內(nèi)部狀態(tài)數(shù)據(jù)score。如下所示:
    Page({
    data: {
        thisWeekMovie: {
        name: "Stephen Curry",
        comment: "最牛逼的三分投手,最萌的庫日天",
        imagePath: "/images/fd.jpg"
        },
        count: 123,
        score: 98
    }
    })
    
  • 接下來要把count+score的值渲染輸出到weekly.wxml視圖上顯示,說明內(nèi)部狀態(tài)變量可以進(jìn)行一些運算或組合后再進(jìn)行輸出。如下所示:
    <view class="container">
        <text>本周推薦</text>
        <image src="../../images/fd.jpg"></image>
        <text>庫里</text>
        <text>點評:最牛逼的三分投手,最萌的庫日天。</text>
        <text>{{count}}</text>
        <text>{{count + score}}</text>   // 內(nèi)部狀態(tài)變量進(jìn)行一些運算
    </view>
    
  • 可以利用條件表達(dá)式對score內(nèi)部狀態(tài)變量進(jìn)行綁定,判斷出一個球員是否為優(yōu)秀、良好、中等、及格、差,并將其渲染在視圖中。
    <view class="container">
        <text>本周推薦</text>
        <image src="../../images/fd.jpg"></image>
        <text>庫里</text>
        <text>點評:最牛逼的三分投手,最萌的庫日天。</text>
        <text>{{count}}</text>
        <text>{{count + score}}</text>
        <text>{{(score >= 90)? "優(yōu)秀": "其他"}}</text>
    </view>
    
  • 接下來,對原始weekly.wxml視圖中的硬編碼進(jìn)行修改,利用thisWeekMovie內(nèi)部狀態(tài)變量進(jìn)行綁定。如下所示:
    <view class="container">
        <text>本周推薦</text>
        <image src="{{thisWeekMovie.imagePath}}"></image>
        <text>{{thisWeekMovie.name}}</text>
        <text>點評:{{thisWeekMovie.comment}}</text>
        <text>{{count}}</text>
        <text>{{count + score}}</text>
        <text>{{(score >= 90)? "優(yōu)秀": "其他"}}</text>
    </view>
    
  • 最后,可以在調(diào)試器窗口中的AppData中查看與修改每個頁面所包含的內(nèi)部狀態(tài)變量值與狀態(tài)。
    02 小程序入門實戰(zhàn)_微信開發(fā)_04

10.小程序運行環(huán)境與基本架構(gòu)

  • 通過開發(fā)者工具調(diào)試器的AppData這個type,我們可以實時的調(diào)試每個頁面的所有內(nèi)部狀態(tài)變量的取值。
    02 小程序入門實戰(zhàn)_微信開發(fā)_05
  • 運行環(huán)境(宿主環(huán)境):每個小程序都是運行在它所在的微信客戶端上的,通過微信客戶端給它提供運行環(huán)境,小程序可以直接獲取微信客戶端原生的體驗和能力。
  • 視圖層(渲染層)和邏輯層
    • 各自的描述語言:wxml視圖文件和wxss樣式文件都是對渲染層的描述;腳本文件js都是對頁面的邏輯層的描述。
    • 各自的運行進(jìn)程:邏輯層的javascript代碼是統(tǒng)一運行在JsCore進(jìn)程中;渲染層的每一個頁面都是在一個獨立的Webview進(jìn)程中進(jìn)行渲染。例如:about頁和weekly頁,都內(nèi)置了一個webviewId的內(nèi)部狀態(tài)變量,來記錄它們各自是在幾號Webview進(jìn)程當(dāng)中進(jìn)行渲染的。
    • 基于數(shù)據(jù)綁定和事件機(jī)制進(jìn)行通訊
      02 小程序入門實戰(zhàn)_微信開發(fā)_06

11.條件渲染

  • wx:if:條件渲染——條件成立時組件才渲染生成。
  • 我們現(xiàn)在想要做的一個改動就是希望在視圖中,對于那些博主真正強(qiáng)烈推薦的NBA球員,我們要顯示一個強(qiáng)烈推薦的紅色標(biāo)識。
    Page({
    data: {
        thisWeekMovie: {
        name: "Stephen Curry",
        comment: "最牛逼的三分投手,最萌的庫日天。",
        imagePath: "/images/fd.jpg",
        isHighlyRecommended: true    // 強(qiáng)烈推薦
        },
        count: 123,
        score: 98
    }
    })
    
  • 首先,把強(qiáng)烈推薦這個元素給定義出來。強(qiáng)烈推薦這個text元素,它的渲染生成的條件是:綁定到了thisWeekMovie.isHighlyRecommended屬性上。當(dāng)博主有對這個NBA球員標(biāo)記為強(qiáng)烈推薦時,返回的這個屬性的取值為true。那么這時候渲染生成條件成立,這個元素會被渲染生成;反正,則為false。那么這時候渲染生成條件不成立,這個元素不會被渲染生成。
    <view class="container">
        <text>本周推薦</text>
        <image src="{{thisWeekMovie.imagePath}}"></image>
        <text>{{thisWeekMovie.name}}</text>
        <text>點評:{{thisWeekMovie.comment}}</text>
        <text>{{count}}</text>
        <text>{{count + score}}</text>
        <text>{{(score >= 90)? "優(yōu)秀": "其他"}}</text>
        <text wx:if="{{thisWeekMovie.isHighlyRecommended}}" style="font-size: 16px; color: red;">強(qiáng)烈推薦</text>
    </view>
    
  • wx:if VS hidden屬性(傳統(tǒng)方法)
    • 使用hidden屬性時,這個元素始終要先被渲染生成,hidden屬性只是控制了它的可見性而已
    • 對于元素可見性需要頻繁切換的場景,不建議使用條件渲染。
    <view class="container">
        <text>本周推薦</text>
        <image src="{{thisWeekMovie.imagePath}}"></image>
        <text>{{thisWeekMovie.name}}</text>
        <text>點評:{{thisWeekMovie.comment}}</text>
        <text>{{count}}</text>
        <text>{{count + score}}</text>
        <text>{{(score >= 90)? "優(yōu)秀": "其他"}}</text>
        <text hidden="{{!thisWeekMovie.isHighlyRecommended}}" style="font-size: 16px; color: red;">強(qiáng)烈推薦</text>
    </view>
    

12.列表渲染

  • wx:for 列表渲染——重復(fù)的渲染生成組件。利用列表渲染可以一次性在weekly頁面中推薦多個NBA球員。首先修改weekly.js文件,增加多個球員的對象信息。
    Page({
    data: {
        weeklyMovieList: [{
        name: "Stephen Curry",
        comment: "最牛逼的三分投手,最萌的庫日天。",
        imagePath: "/images/curry1.jpg",
        isHighlyRecommended: true
        },
        {
        name: "Harden",
        comment: "最牛逼的碰瓷手,最長的大胡子。",
        imagePath: "/images/harden1.jpg",
        isHighlyRecommended: true
        },
        {
        name: "Durant",
        comment: "最牛逼的得分手,最強(qiáng)的死神。",
        imagePath: "/images/durant1.png",
        isHighlyRecommended: true
        }],
        count: 123,
        score: 98
    }
    })
    
  • 接著,對weekly.wxml視圖文件重新編寫,注意其中的wx:for列表渲染語法。當(dāng)中,item和index屬性是列表渲染wx:for自帶的屬性。
    <view class="movie" wx:for="{{weeklyMovieList}}">
        <image class="movie-image" src="{{ item.imagePath}}"></image>
        <view class="movie-details">
            <text>第{{index+1}}周:{{item.name}}</text>
            <text>點評:{{item.comment}}</text>
            <text wx:if="{{item.isHighlyRecommended}}" style="font-size: 16px; color: red">強(qiáng)烈推薦</text>
        </view>
    </view>
    
  • 最后,使用彈性盒子模型對頁面視圖進(jìn)行樣式布局。如下所示:
    .movie {
    display: flex;
    } 
    
    .movie-details {
    display: flex;
    flex-direction: column;
    width: 550rpx;
    }
    
    .movie-image {
    width: 200rpx;
    height: 200rpx;
    }
    

02 小程序入門實戰(zhàn)_微信開發(fā)_07

13.使用swipter組件

  • 使用swipter組件——從列表展示變?yōu)榛脽羝啿フ故尽?strong>swipter元素用來表示一個滑動容器,常用于幻燈片輪播或輪播圖效果。在設(shè)置幻燈片的寬高時,一般要在swipter元素上統(tǒng)一設(shè)置。
    <view class="">
        <swiper>
            <swiper-item class="movie" wx:for="{{weeklyMovieList}}" wx:key="key">
                <image class="movie-image" src="{{ item.imagePath}}"></image>
                <view class="movie-details">
                    <text>第{{index+1}}周:{{item.name}}</text>
                    <text>點評:{{item.comment}}</text>
                    <text wx:if="{{item.isHighlyRecommended}}" style="font-size: 16px; color: red">強(qiáng)烈推薦</text>
                </view>
            </swiper-item>
        </swiper>
    </view>
    
  • 幻燈片輪播的樣式優(yōu)化
    <view class="">
        <swiper class="movie-swiper" indicator-dots="{{true}}" previous-margin="50rpx" next-margin="50rpx">
            <swiper-item class="movie" wx:for="{{weeklyMovieList}}" wx:key="key">
                <view class="container movie-card">
                    <image class="movie-image" src="{{ item.imagePath}}"></image>
                    <text>第{{index+1}}周:{{item.name}}</text>
                    <text>點評:{{item.comment}}</text>
                    <text wx:if="{{item.isHighlyRecommended}}" style="font-size: 16px; color: red">強(qiáng)烈推薦</text>
                </view>
            </swiper-item>
        </swiper>
    </view>
    
  • 以下是weekly.wxss文件內(nèi)容:
    .movie {
    display: flex;
    } 
    
    .movie-swiper {
    height: 90vh;
    }
    
    .movie-card {
    height: 100%;
    width: 100%;
    background: #eee;
    margin: 0 20rpx;
    }
    
    .movie-image {
    width: 200rpx;
    height: 200rpx;
    }
    

02 小程序入門實戰(zhàn)_微信開發(fā)_08

14.頁面的生命周期函數(shù)

  • 需求1:在swiper中如何默認(rèn)切換到最后一頁幻燈片?
    <view class="">
        <swiper class="movie-swiper" indicator-dots="{{true}}" previous-margin="50rpx" next-margin="50rpx" current="{{weeklyMovieList.length - 1}}">
            <swiper-item class="movie" wx:for="{{weeklyMovieList}}" wx:key="key">
                <view class="container movie-card">
                    <image class="movie-image" src="{{ item.imagePath}}"></image>
                    <text>第{{index+1}}周:{{item.name}}</text>
                    <text>點評:{{item.comment}}</text>
                    <text wx:if="{{item.isHighlyRecommended}}" style="font-size: 16px; color: red">強(qiáng)烈推薦</text>
            <text bindtap="f0" wx:if="{{index < (weeklyMovieList.length - 1)}}" class="return-button">返回本周</text>
                </view>
            </swiper-item>
        </swiper>
    </view>
    
  • 上面在weekly.ml文件中直接添加swiper元素的current屬性,可以實現(xiàn)默認(rèn)切換到最后一頁幻燈片。但是,當(dāng)實現(xiàn)需求2時無法給返回本周按鈕綁定內(nèi)部狀態(tài)數(shù)據(jù)currentIndex。根本原因是:由于在小程序中邏輯層與渲染層是獨立的,小程序并沒有提供類似于DOM這樣的API,讓邏輯層的javascript對渲染層進(jìn)行直接更新。因此,首先需要在渲染層建立對內(nèi)部狀態(tài)數(shù)據(jù)currentIndex的綁定。然后在邏輯層的javascript中通過對渲染層所綁定的內(nèi)部狀態(tài)數(shù)據(jù)更新,間接的對渲染層數(shù)據(jù)進(jìn)行更新。所以,先要在weekly.js文件中定義內(nèi)部狀態(tài)數(shù)據(jù)currentIndex。
    Page({
    data: {
        weeklyMovieList: [{
            name: "Stephen Curry",
            comment: "最牛逼的三分投手,最萌的庫日天。",
            imagePath: "/images/curry1.jpg",
            isHighlyRecommended: true
        },
        {
            name: "Harden",
            comment: "卡戴珊的最強(qiáng)對手,最穩(wěn)的罰球與歐洲步。",
            imagePath: "/images/harden1.jpg",
            isHighlyRecommended: true
        },
        {
            name: "Durant",
            comment: "最牛逼的得分手,最強(qiáng)的死神來啦。",
            imagePath: "/images/durant.jpg",
            isHighlyRecommended: true
        }],
        count: 123,
        score: 98,
        currentIndex: 0
    },
    
    onLoad: function(options) {
        this.setData({
        currentIndex: this.data.weeklyMovieList.length - 1
        })
    }
    })
    
  • 接著,在weekly.wxml文件中重新給current綁定一個內(nèi)部狀態(tài)數(shù)據(jù)currentIndex,如下所示:
    <view class="">
        <swiper class="movie-swiper" indicator-dots="{{true}}" previous-margin="50rpx" next-margin="50rpx" current="{{currentIndex}}">
            <swiper-item class="movie" wx:for="{{weeklyMovieList}}" wx:key="key">
                <view class="container movie-card">
                    <image class="movie-image" src="{{ item.imagePath}}"></image>
                    <text>第{{index+1}}周:{{item.name}}</text>
                    <text>點評:{{item.comment}}</text>
                    <text wx:if="{{item.isHighlyRecommended}}" style="font-size: 16px; color: red">強(qiáng)烈推薦</text>
            <text bindtap="f0" wx:if="{{index < (currentIndex)}}" class="return-button">返回本周</text>
                </view>
            </swiper-item>
        </swiper>
    </view>
    
  • 需求2:在非本周幻燈片頁面添加“返回本周”按鈕
    .movie {
        display: flex;
    } 
    
    .movie-swiper {
        height: 90vh;
    }
    
    .movie-card {
        height: 100%;
        width: 100%;
        background: #eee;
        margin: 0 20rpx;
        position: relative;
    }
    
    .movie-image {
        width: 200rpx;
        height: 200rpx;
    }
    
    .return-button {
        position: absolute;
        right: 0;
        top: 40px;
        font-size: 26rpx;
        font-style: italic;
        border: 1px solid blue;
        border-right: 0;
        border-radius: 10%;
    }
    
  • 頁面的生命周期及頁面生命周期函數(shù):onLoad(options)、onShow(options)、onReady(options)、onHide(options)、onUnload(options)
    • 小程序注冊完成后,加載頁面,觸發(fā)onLoad方法,一個頁面只會調(diào)用一次;
    • 頁面載入后觸發(fā)onShow方法,顯示頁面,每次打開頁面都會調(diào)用一次;
    • 首次顯示頁面,會觸發(fā)onReady方法,渲染頁面和樣式,一個頁面只會調(diào)用一次;
    • 當(dāng)小程序后臺運行或跳轉(zhuǎn)到其他頁面時,觸發(fā)onHide方法;
    • 當(dāng)小程序從后臺進(jìn)入前臺運行或重新載入頁面時,觸發(fā)onShow方法;
    • 當(dāng)使用wx.readirectTo(OBJECT)或關(guān)閉當(dāng)前頁返回上一頁wx.navigateBack(),觸發(fā)onUnload
  • 小程序的生命周期app.js
    • 用戶首次打開小程序,會觸發(fā)onLauch(全局只觸發(fā)一次);
    • 小程序初始化完成后,觸發(fā)onShow方法,監(jiān)聽小程序顯示;
    • 小程序從前臺進(jìn)入后臺,觸發(fā)onHide方法;
    • 小程序從后臺進(jìn)入前臺顯示,觸發(fā)onShow方法;
    • 小程序后臺運行一定時間,或系統(tǒng)資源占用過高,會被銷毀;

?

本文摘自 :https://blog.51cto.com/u

開通會員,享受整站包年服務(wù)立即開通 >