1. 程式人生 > >【微信小程式】微信小程式學習筆記(每日更新ing_20180523打卡)

【微信小程式】微信小程式學習筆記(每日更新ing_20180523打卡)

1、app.json檔案中頁面路徑前不要加/

2、圖片儘量不要儲存在小程式的目錄中。(因為小程式的大小不能超過1MB,超過則無法真機執行和釋出專案。應該將圖片都存放在伺服器上,讓小程式通過網路來載入圖片)

3、設定display:flex是應用一切彈性佈局屬性的先決條件,如果不設定display:flex,那麼後續的其他相關彈性佈局屬性都將無效

4、使用rpx單位可以使元件自適應螢幕的高度和寬度(px不會自適應);建議以iphone6的寬度750個物理畫素作為標準做設計圖。轉換比例為 1物理畫素=1rpx=0.5px

5、border屬性不需要動態變化,如果動態變化,會在螢幕尺寸較大的手機上變得很粗。建議在iPhone6尺寸下做設計圖。模擬器機型的解析度是邏輯解析度pt,而非物理解析度。375X667;Dpr:2,代表iphone6的水平方向有375個邏輯畫素點,垂直方向有667個邏輯畫素點,每個邏輯畫素點包含2個物理畫素點。(通常PS裡的畫素指物理畫素)

(e.g. 一張圖片750畫素,水平充滿頁面,設定750rpx或375px)

6、需要同時設定swiper元件和image元件的高寬。


7、頁面生命週期:

  • 載入 onLoad:一個頁面只會呼叫一次
  • 顯示 onShow:每次開啟頁面都會呼叫
  • 渲染 onReady:監聽初次渲染完成,一個頁面只會呼叫一次,代表頁面已經準備妥當,可以和檢視層進行互動
  • 隱藏 onHide:監聽頁面隱藏
  • 解除安裝 onUnload:監聽頁面解除安裝

一個頁面要正常顯示,必須經歷“載入、顯示、渲染”三個生命週期。onShow的執行時刻是在onReady之前的。

除了First Render第一次渲染,頁面還有可能會Rerender再次渲染多次。

資料更新會造成頁面的重新渲染。onReady只監聽“第一渲染”的完成

8、在真實的專案中,業務資料通常都放置在自己的伺服器中,然後通過HTTP請求來訪問伺服器提供的RESTFUL API,從而實現資料獲取。

9、小程式的指令碼邏輯是執行在JScore中,JScore是一個沒有DOM的環境,完全拋棄了DOM結構,只能通過資料繫結來做資料的相關操作

10、小程式僅實現了單向資料繫結,即只支援從邏輯層傳遞到渲染層的資料繫結,反之則不可以

11、小程式使用Page方法引數裡的data變數作為資料繫結的橋樑

12、資料繫結有兩種:

  1. 一種是初始化資料的資料繫結。通常將這些資料直接寫在Page方法引數的data物件下面
  2. 另一種是使用setData方法來做資料繫結,這種方式也可以理解為資料更新。這樣的資料更新將引起頁面的Rerender(重新渲染)

13、小程式使用Mustache語法{{}}在wxml元件裡進行資料繫結

14、初始化資料繫結過程:

當頁面執行了onShow函式後,邏輯層會收到一個通知(Notify);隨後邏輯層會將data物件以json的形式傳送到View檢視層(Send Initial Data),檢視層接收初始化資料後,開始渲染並顯示初始化資料(First Render),最終將資料呈現在開發者眼前。

15、資料繫結更新:setdata

setData方法位於Page物件的原型鏈上:Page.prototype.setData。使用this.setData的方式呼叫

setData的引數接收一個物件,以key和value的形式將this.data中的key對應的值設定成value.

注意:

  • setData會改變this.data變數裡相同key的值
  • setData執行後會通知邏輯層執行Rerender,並立刻重新渲染檢視。

16、關於資料繫結的錯誤,小程式目前不會給出任何錯誤提醒。如果發現整個頁面是空白的又沒有錯誤訊息,多半是資料綁定出了問題。(此時,AppData面板是最好的除錯工具)

17、列表渲染:

  <block wx:for="{{postList}}" wx:for-item="item" wx:for-index="idx">
    <view class='post-container'>
      <view class='post-author-date'>
        <image src='{{item.avatar}}'></image>
        <text>{{item.object.date}}</text>
      </view>
      <text class='post-title'>{{item.title}}</text>
      <image class='post-image' src='{{item.postImg}}'></image>
      <text class='post-content'>{{item.content}}
      </text>
    </view>
  </block>

<block>標籤並沒有實質意義,它並不是元件,所以稱作“標籤”。(它僅僅是一個包裝,可以理解為常見程式語言裡的括號,不會再頁面內被渲染,在block標籤中被包裹的元素將被重複渲染。)

block標籤中的wx:for屬性,值為{{postList}},對應post.js檔案中setData的陣列資料。wx:for並不是一定要作用在block標籤上。把block標籤換成view一樣可以執行,但我們希望標籤或元件的語義是明確地。view元件通常被用來做容器或區域分隔,不不應該被濫用。

如果不定義item,小程式預設的子元素變數名即為item。也可以將它替換為其他變數名,如:wx:for-item="element".

18、頁面的json檔案只能配置和window相關屬性;app.json除了可以配置window,還可以配置pages、tabBar等選項

(頁面json配置不需要加window物件,直接編寫window配置項即可)

19、事件:事件是檢視層(wxml)到邏輯層(js)的通訊方式。

可以讓我們在js裡處理使用者在介面上的一些操作並作出反饋。如點選按鈕後,需要在js裡呼叫MINA框架的API,是頁面從welcome跳轉到post.

20、實現事件機制:

step1:在元件上註冊事件。(註冊事件將告訴小程式,我們要監聽哪個元件的什麼事件。本例是button元件的tap事件)

step2:在js中編寫事件處理函式響應事件。(監聽到事件後的處理業務)

21、小程式共提供了3個導航API:

  • wx.redirectTo:關閉當前頁面,跳轉到指定頁面
  • wx.navigateTo:保留當前頁面,跳轉到指定頁面
  • wx.switchTap(122100新增版本):跳轉到帶tabbar的頁面,並關閉其他所有非tabbar頁面


url是頁面路徑,不要加副檔名。

redirectTo和navigateTo在使用方式上完全相同,都接受一個Object物件作為引數。

Object引數還可以接收3個方法:

  • success:跳轉頁面成功時呼叫
  • fail:跳轉失敗時呼叫
  • complete:無論成功或失敗,都會呼叫

(在小程式中,幾乎所有非同步型別的API都配備有這3個方法)

22、redirectTo:將解除安裝welcome頁面,並執行onUnload事件函式。

   

navigateTo:隱藏當前頁面,還可以再次返回到被隱藏頁面

  

再次從post頁面返回到welcome頁面時,會執行post頁面的onUnload函式(130400版本,即子頁面返回父頁面時,子頁面會被解除安裝。頁面是否被解除安裝是非常重要的行為,不解除安裝頁面將使全域性性的一些行為,比如音樂播放的處理變得非常複雜)

23、當我們使用navigateTo從父頁面跳轉到子頁面後,就形成了2個頁面層級。

小程式強制規定只允許有最多五層父子頁面。(建議不超過3層)

24、冒泡事件

冒泡事件:某元件上的事件被觸發後,事件還會向父級元素傳遞;父級元素還會繼續向父級元素傳遞,直到頁面頂級元素。

(非冒泡事件不會向上傳遞)

常見的冒泡事件:

  • touchstart:手指觸控動作開始
  • touchmove:手指觸控後移動
  • touchcancel:手指觸控動作被打斷,如來電提醒、彈窗
  • touchend:手指觸控動作結束
  • tap:手指觸控後馬上離開
  • longtap:手指觸控後,超過350ms再離開

在wxml元件裡註冊事件時,不可直接使用tap="function"或touchmove="function",需要在事件名前新增字首catch或bind

(catch將阻止事件繼續向父節點傳播;bind不阻止)

welcom.js

Page({
  onUnload: function (event) {
    console.log("page is unload")
  },
  onHide: function (event) {
    console.log("page is hide")
  },
  onTapJump: function (event) {
    wx.navigateTo({
      url: '/pages/post/post',
      success: function () {
        console.log("jump success")
      },
      fail: function () {
        console.log("jump fail")
      },
      complete: function () {
        console.log("complete")
      }
    });
  },
  onTapJumpFather:function(event){
   console.log("tap事件傳遞!")
  }
})

welcome.wxml:

<view catchtap='onTapJumpFather' class='container'>
  <image class='avatar' src='/images/avatar/1.png'></image>
  <text class='motto'>Hello,桔子罐頭</text>
  <view bindtap='onTapJump' class='journey-container'>
    <text class='journey'>開啟小程式之旅</text>
  </view>
</view>

result:


若改為:

<view catchtap='onTapJump' class='journey-container'>
    <text class='journey'>開啟小程式之旅</text>
  </view>

result:

無特殊申明都是非冒泡事件。非冒泡事件大多不是通用事件,是某些元件特有事件。如<form/>的submit事件,<input/>的input事件,<scroll-view/>的scroll事件。

常見的冒泡事件:

  • touchstart:手指觸控動作開始
  • touchmove:手指觸控後移動
  • touchcancel:手指觸控動作被打斷,如來電提醒、彈窗
  • touchend:手指觸控動作結束
  • tap:手指觸控後馬上離開
  • longtap:手指觸控後,超過350ms再離開

25、模組化:

所有文章資料都被強行寫在post.js裡,汙染業務層,嘗試將這些資料分離到一個單獨的js檔案中。

其他檔案訪問模組:

STEP1:data.js 暴露介面:module.exports={postList:postList}

STEP2: post.js引入模組:



不同於頁面路徑,被引用檔案一定要帶有副檔名js

path路徑不可以使用絕對路徑,否則會報錯。

在js中宣告的變數和函式只在該檔案中有效,不同的檔案可以宣告相同名字的變數和函式,不會互相影響。

在輸出模組時,我們是將postList作為一個object屬性賦值給module.exports,所以require時,得到的也是一個object而非postList,需要使用dataObj.postList才能獲取到真實的文章資料

object不僅可以包含postList,還可以在data.js檔案中定義除了postList外的其他資料,並作為object的屬性一起輸出。

require只會模組化的一種方式,還可以使用ES6的Module來編寫模組,開發工具預設使用label將開發者的ES6程式碼轉化成ES5程式碼。

26、模板化

使用列表渲染展現文章列表並不是最好的辦法,因為如果其他頁面同樣需要顯示文章列表,總不能吧wxml程式碼到處拷貝啊~~~

藉助函式思想,將一些公共的、經常使用的業務邏輯提取成一個公共的函式,呼叫即可。