建立自定義元件
自定義元件類似頁面,需要有 js
wxss
wxml
json
四個檔案。
首先在 json 宣告這是一個自定義元件:
{
"component": true
}
複製程式碼
程式碼示例:
<!-- 自定義元件內部的 wxml 結構 -->
<view class="inner">
{{ innerText }}
</view>
<slot></slot>
複製程式碼
/* 自定義元件內部樣式 */
.inner {
color: red
}
複製程式碼
注意:自定義元件內部樣式不能夠使用 ID 選擇器,屬性和標籤名選擇器。
程式碼示例:
Component({
properties: {
// props
innerText: {
type: String,
value: 'defult'
}
},
data: {
// 一些自定義元件內部狀態
someData: {}
},
methods: {
// 一些自定義元件的方法
customMethod: function () {}
}
})
複製程式碼
注意:自定義元件要用 Component 來註冊元件。
在 Page 應用的時候需要配置 page.json 檔案
{
"usingComponents": {
"component-tag-name": "xxx/xxx"
}
}
複製程式碼
然後直接在 page.wxml 引用
<view>
<component-tag-name inner-text="some text"></component-tag-name>
</view>
複製程式碼
元件模板和樣式
slot
<!-- 元件模板 -->
<view>
<view>這是元件內的文字</view>
<slot></slot>
</view>
複製程式碼
<!-- 元件引用 -->
<view>
<component-tag-name>
<!-- 外部插入到元件內部 -->
<view>我是元件外部傳進去的文字</view>
</component-tag-name>
</view>
複製程式碼
開啟多個 slot 支援
Component({
options: {
multipleSlots: true // 在元件內定義支援多 slot
}
})
複製程式碼
<view>
<slot name="before"></slot>
<view>略略略</view>
<slot name="after"></slot>
</view>
複製程式碼
<view>
<component-tag-name>
<!-- 這部分將插入 slot name="before" -->
<view slot="before">我在前面</view>
<!-- 這部分將插入 slot name="after" -->
<view slot="after">我在後面</view>
</component-tag-name>
</view>
複製程式碼
知識點: :host
選擇器 將對該元件所在節點的預設樣式
外部樣式類
Component({
externalClasses:['my-class']
})
複製程式碼
<component-tag-name class="my-class">這段文字的顏色由元件外的樣式所決定</component-tag-name>
複製程式碼
Component 構造器
注意:
this.data
可以訪問內部狀態,但是不要直接修改他們,請使用this.setData()
- 生命週期函式無法直接通過
this
訪問到 - 屬性名避免 data 開頭,否則會被解析為 dataset
- 在一個元件的定義和使用時,屬性和 data 互不衝突
元件間的通訊
- 父元件向子元件傳遞資料
- 子元件傳送事件並傳遞資料到父元件
- 父元件呼叫子元件內部的方法
this.selectComponent
監聽事件
當元件內部 myevent
觸發的時候, 呼叫 onMyEvent
方法。
<component-tag-name bind:myevent="onMyEvent"></component-tag-name>
複製程式碼
觸發事件
<!-- 在自定義元件中 -->
<button bindtap="onTap">點選這個按鈕將觸發“myevent”事件</button>
複製程式碼
Component({
properties: {}
methods: {
onTap: function(){
var myEventDetail = {} // detail物件,提供給事件監聽函式
var myEventOption = {} // 觸發事件的選項
this.triggerEvent('myevent', myEventDetail, myEventOption)
}
}
})
複製程式碼
behaviors
類似於 vue 中的 mixin ,用法也一樣 詳見