教程請查看小程序開發文檔:https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/
自定義組件:自定義組件可以將不同頁面具有共同樣式的布局獨立開來,減少代碼的重復冗余,也能更好的維護組件。
例:自定義彈框,自定義加載,自定義列表等等,自定義彈框網上教程很多,此處就講講自定義列表,原理大同小異,細節需要多加注意。
最終效果:
1.建立component文件夾,專門存放自定義組件 如:goodsList 自定義組件
2,編寫自定義組件基本樣式,即列表中的一個item
goodsList.wxml
<!--component/goodsList/goodsList.wxml--> <view class='list-group'> <view class='list-left'> <image src='/pages/images/goods.png' class='img' mode="widthFix"></image> </view> <view class='list-right'> <view class='title'>{{title}}</view> <view class='desc'>{{desc}}</view> <view class='price-box'> <text class='price'>{{price}}</text> <text class='num'>x{{num}}</text> </view> <view class='illustrate'> <text>支持7天無理由退貨</text> <a class='more'>價格說明</a> </view> </view> </view>
goodsList.wxss 此處使用 :host選擇器,:host選擇器主要作用於組件整體,不針對組件內部樣式。需要注意的是:組件本身不是block,需要先設置為block后,相應的樣式才會生效。
其他選擇器:(建議使用class選擇器)
#a { } /* 在組件中不能使用 */ [a] { } /* 在組件中不能使用 */ button { } /* 在組件中不能使用 */ .a > .b { } /* 除非 .a 是 view 組件節點,否則不一定會生效 */
/* component/goodsList/goodsList.wxss */ :host{ display: block; border-bottom: 1px solid #e0e0e0; } .list-group{ display: flex; padding:5px 10px; } .img{ width:100%; } .list-left{ flex:0 0 100px; } .list-right{ flex:1; } .title{ font-size:16px; display: -webkit-box; overflow: hidden; -webkit-line-clamp: 2; text-overflow: ellipsis; -webkit-box-orient: vertical; } .desc{ font-size:14px; color:#7a7a7a; margin-top:5px; } .price-box{ margin-top:5px; } .price{ font-size:14px; color:red; } .num{ font-size:14px; float: right; } .illustrate{ font-size:14px; margin-top:5px; color:#7a7a7a; } .more{ float: right; color:rgb(67,197,230); }
goodsList.js
// component/goodsList/goodsList.js Component({ /** * 組件的屬性列表 */ properties: { title: { // 屬性名 type: String, // 類型(必填),目前接受的類型包括:String, Number, Boolean, Object, Array, null(表示任意類型) value: '標題' // 屬性初始值(可選),如果未指定則會根據類型選擇一個 }, desc: { type: String, value: '描述' }, price: { type: String, value: '價格' }, num: { type: Number, value: 2 } }, /** * 組件的初始數據 */ data: { }, /** * 組件的方法列表 */ methods: { } })
goosList.josn ( 必須啟用,否則自定義組件不能被識別 )
{ "component": true, "usingComponents": {} }
3,在index中引入自定義組件
index.wxml
<!--goodsList自定義組件引用 --> <goodsList id="goodsList" wx:for="{{goodsArray}}" wx:key="unique" title="{{item.title}}" desc="{{item.desc}}" price="{{item.price}}" num="{{item.num}}"> </goodsList>
index.js
Page({ data: { goodsArray: [ { title: '顏域蝴蝶結荷葉領雪紡連衣裙女夏時尚高端斑點裙子2018年新款熱銷', desc: '黑點 M碼', price: '¥999.0', num: '2' }, { title: '顏域蝴蝶結荷葉領雪紡連衣裙女夏時尚高端斑點裙子2018年新款熱銷', desc: '黑點 M碼', price: '¥999.0', num: '2' }, { title: '顏域蝴蝶結荷葉領雪紡連衣裙女夏時尚高端斑點裙子2018年新款熱銷', desc: '黑點 M碼', price: '¥999.0', num: '2' }, { title: '顏域蝴蝶結荷葉領雪紡連衣裙女夏時尚高端斑點裙子2018年新款熱銷', desc: '黑點 M碼', price: '¥999.0', num: '2' }, { title: '顏域蝴蝶結荷葉領雪紡連衣裙女夏時尚高端斑點裙子2018年新款熱銷', desc: '黑點 M碼', price: '¥999.0', num: '2' } ] }, canvasIdErrorCallback: function (e) { console.error(e.detail.errMsg) }, onReady: function (e) { this.goodsList = this.selectComponent("#goodsList"); } })
index.json ( 必須引入自定義組件,否則無法使用 )
{ "usingComponents": { "goodsList": "/component/goodsList/goodsList" } }
以上,一個自定義列表組件基本完成,還有一些事件處理,類似於vue中的事件派發,官網教程示例:
按照個人理解,此處的事件類似於vue中,子組件向父組件派發事件,父組件監聽事件,然后進行事件處理並執行。
Component({ properties: {} methods: { onTap: function(){ var myEventDetail = {} // detail對象,提供給事件監聽函數 var myEventOption = {} // 觸發事件的選項 this.triggerEvent('myevent', myEventDetail, myEventOption) } } })
具體示例可以查看 https://www.jianshu.com/p/8a2a730d9e60,實現自定義彈框組件。
效果如圖: