只是展示用,建議使用template,組件中涉及到較多的邏輯,建議使用component。 因為template沒有自己的js文件,所以在列表中涉及到列表子項獨立的操作,建議將列表子項寫成component。
示例代碼: page文件
<!--Wxml--> <!--引用--> <import src="goodlist.wxml"/> <!--使用 goodList為page傳入的數據--> <template is="statement-goodlist" data="{{goodList}}"/>
Wxs更多的是作為一個過濾器使用,.wxs 文件可以被其他的 .wxs 文件 或 WXML 中的 標簽引用。 .wxs模塊中引用其他 wxs 文件模塊,可以使用 require 函數。
示例代碼 page文件--類似過濾器效果
<!--wxml--> <!--引用--> <wxs src="../../assets/wxs/phonenum.wxs" module="phone" /> <!--使用--> <text class='statement-adress-cellphone'>{{phone.phone(AddressInfo.phone)}}</text>
/** * 生命周期函數--監聽頁面隱藏 */ onHide: function () { // 前進-跳轉到其他頁面的時候 }, /** * 生命周期函數--監聽頁面卸載 */ onUnload: function () { // 后退-點擊當前頁面返回的時候 }
利用這兩個生命周期可以解決的問題: 防止用戶快速切換頁面(A->B)。導致動態設置導航欄中的文字顯示出現錯誤 快速切換頁面可能導致A頁面中的異步數據還未返回,致使當切換到B頁面的時候A數據才返回,使得導航欄顯示的文字為A頁面的導航欄標題。(即:A頁面的導航欄標題為hello,B頁面的導航欄標題為world,當快速由A->B,此時雖然在B頁面,但是導航欄標題顯示的是hello,而不是world)
參考鏈接: 小程序中的生命周期onHide和onUnload
如果說數據是汽車的話,傳遞的通道或方式就是汽車要行駛的道路。所以,數據驅動型的框架,我們少不了要學習如何建設這條"道路",讓"汽車"高速行駛。
page為頁面的屬性名
components 為組件的外部屬性名, 用properties對象接收
頁面
<!-- Wxml --> <components-a components="{{page}}"></components-a> <!-- Js --> Page({ data: { page: '父親pages' } })
組件
父親pages
<!-- Wxml --> <!-- Js --> Component({ /** * 組件的屬性列表 */ properties: { components: { // 屬性名 type: String } }, /** * 組件的方法列表 */ methods: { onTap: function () { let page = this.data.components console.log(page) // 我是父親pages } } })
給組件設置myevent事件,通過this.triggerEvent('myevent', myEventDetail) 觸發該myevent事件并傳遞內容,在頁面用onMyEventshi事件監聽傳遞過來的數據。
頁面
<!-- Wxml --> <components-a bind:myevent="onMyEvent"></components-a> <!-- Js --> Page({ // 監聽myevent事件 onMyEvent: function (e) { console.log('接收a組件傳遞的內容:', e.detail) // '我是a組件' } })
組件
<!-- Wxml --> <!-- 在自定義組件"components-a"中 --> <button bindtap="onTap">點擊</button> <!-- Js --> Component({ properties: {} methods: { onTap: function(){ var myEventDetail = '我是a組件' this.triggerEvent('myevent', myEventDetail) // 觸發組件上的“myevent”事件 } } })
兩個有關聯的組件(同一個父頁面下): 通過上面的方法,用組件 => 頁面 => 組件 的方式傳遞數據。
// A頁面-傳遞數據 // 需要注意的是,wx.switchTab 中的 url 不能傳參數。 wx.navigateTo({ url: '../pageD/pageD?name=raymond&gender=male' }) // B頁面-接收數據 // 通過onLoad的option <!-- JS --> ... Page({ onLoad: function(option){ console.log(option.name + 'is' + option.gender) // raymond is male this.setData({ option: option }) } })
這個方法的精髓,是通過獲取到其他頁面的對象原型, 然后通過原型方法 setData 對當前對象管理的 data 進行修改 ,
示例如下:
// pageE.js Page({ data: { index: 1 } })
當跳轉到下一個頁面 F 之后,假定在 F 中有操作需要對 E 中的數據有修改,則可以使用以下方法:
// pageF.js ... Page({ changeIndexInE: function(){ var pages = getCurrentPages(); var prevPage = pages[pages.length - 2]; prevPage.setData({ index: 0 }) } })
這個方法可以操作頁面堆棧里面的頁面的數據, 可以做到讓后一級頁面對上級頁面群的數據管理 。
參考鏈接: 愛范兒-頁面之間的數據傳遞
頁面
<!-- Wxml --> <template is="msgItem" data="{{...item}}"/> <!-- JS --> Page({ data: { item: { index: 0, msg: 'this is a template', time: '2016-09-15' } } })
傳入模板的除了變量,還可以是事件方法對象。例如,模板中的點擊事件,可以傳遞到使用模板的元素中。
根據文檔,采用'array[0].text':'changed data'的格式。但是我們實際應用中需要改變的索引值往往是動態的,所以,改裝一下如下:
示例代碼:
// 修改某個數組的動態的值 --- 提前將數組對象準備好 // 索引index是變量, value是變量 var shipmentTypeObj = "shipmentType[" + index + "].code" this.setData({[shipmentTypeObj]: value})