W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
類(lèi)似于頁(yè)面,自定義組件擁有自己的 qml 模板和 qss 樣式。
組件模板
組件模板的寫(xiě)法與頁(yè)面模板相同。組件模板與組件數(shù)據(jù)結(jié)合后生成的節(jié)點(diǎn)樹(shù),將被插入到組件的引用位置上。
在組件模板中可以提供一個(gè)<slot>
節(jié)點(diǎn),用于承載組件引用時(shí)提供的子節(jié)點(diǎn)。
<!-- 組件模板 -->
<view class="wrapper">
<view>這里是組件的內(nèi)部節(jié)點(diǎn)</view>
<slot></slot>
</view>
<!-- 引用組件的頁(yè)面模板 -->
<view>
<component-tag-name>
<!-- 這部分內(nèi)容將被放置在組件 <slot> 的位置上 -->
<view>這里是插入到組件slot中的內(nèi)容</view>
</component-tag-name>
</view>
注意,在模板中引用到的自定義組件及其對(duì)應(yīng)的節(jié)點(diǎn)名需要在 json 文件中顯式定義,否則會(huì)被當(dāng)作一個(gè)無(wú)意義的節(jié)點(diǎn)。除此以外,節(jié)點(diǎn)名也可以被聲明為抽象節(jié)點(diǎn)。
與普通的 QML 模板類(lèi)似,可以使用數(shù)據(jù)綁定,這樣就可以向子組件的屬性傳遞動(dòng)態(tài)數(shù)據(jù)。
代碼示例:
<!-- 引用組件的頁(yè)面模板 -->
<view>
<component-tag-name prop-a="{{dataFieldA}}" prop-b="{{dataFieldB}}">
<!-- 這部分內(nèi)容將被放置在組件 <slot> 的位置上 -->
<view>這里是插入到組件slot中的內(nèi)容</view>
</component-tag-name>
</view>
在以上例子中,組件的屬性 propA 和 propB 將收到頁(yè)面?zhèn)鬟f的數(shù)據(jù)。頁(yè)面可以通過(guò) setData 來(lái)改變綁定的數(shù)據(jù)字段。 注意:這樣的數(shù)據(jù)綁定只能傳遞 JSON 兼容數(shù)據(jù)。
在組件的qml中可以包含 slot 節(jié)點(diǎn),用于承載組件使用者提供的qml結(jié)構(gòu)。 默認(rèn)情況下,一個(gè)組件的qml中只能有一個(gè)slot。需要使用多slot時(shí),可以在組件js中聲明啟用。
Component({
options: {
multipleSlots: true // 在組件定義時(shí)的選項(xiàng)中啟用多slot支持
},
properties: { /* ... */ },
methods: { /* ... */ }
})
此時(shí),可以在這個(gè)組件的qml中使用多個(gè)slot,以不同的 name 來(lái)區(qū)分。
<!-- 組件模板 -->
<view class="wrapper">
<slot name="before"></slot>
<view>這里是組件的內(nèi)部細(xì)節(jié)</view>
<slot name="after"></slot>
</view>
組件qml的slot 在組件的qml中可以包含 slot 節(jié)點(diǎn),用于承載組件使用者提供的qml結(jié)構(gòu)。 默認(rèn)情況下,一個(gè)組件的qml中只能有一個(gè)slot。需要使用多slot時(shí),可以在組件js中聲明啟用。
Component({
options: {
multipleSlots: true // 在組件定義時(shí)的選項(xiàng)中啟用多slot支持
},
properties: { /* ... */ },
methods: { /* ... */ }
})
此時(shí),可以在這個(gè)組件的qml中使用多個(gè)slot,以不同的 name 來(lái)區(qū)分。
<!-- 組件模板 -->
<view class="wrapper">
<slot name="before"></slot>
<view>這里是組件的內(nèi)部細(xì)節(jié)</view>
<slot name="after"></slot>
</view>
使用時(shí),用 slot 屬性來(lái)將節(jié)點(diǎn)插入到不同的slot上。
<!-- 引用組件的頁(yè)面模板 -->
<view>
<component-tag-name>
<!-- 這部分內(nèi)容將被放置在組件 <slot name="before"> 的位置上 -->
<view slot="before">這里是插入到組件slot name="before"中的內(nèi)容</view>
<!-- 這部分內(nèi)容將被放置在組件 <slot name="after"> 的位置上 -->
<view slot="after">這里是插入到組件slot name="after"中的內(nèi)容</view>
</component-tag-name>
</view>
組件對(duì)應(yīng)qss
文件的樣式,只對(duì)組件qml內(nèi)的節(jié)點(diǎn)生效。編寫(xiě)組件樣式時(shí),需要注意以下幾點(diǎn):
#a
)、屬性選擇器([a]
)和標(biāo)簽名選擇器,請(qǐng)改用class選擇器。.a .b
)在一些極端情況下會(huì)有非預(yù)期的表現(xiàn),如遇,請(qǐng)避免使用。.a>.b
)只能用于 view 組件與其子節(jié)點(diǎn)之間,用于其他組件可能導(dǎo)致非預(yù)期的情況。font
、 color
,會(huì)從組件外繼承到組件內(nèi)。app.qss
中的樣式、組件所在頁(yè)面的的樣式對(duì)自定義組件無(wú)效。這樣,組件的使用者可以指定這個(gè)樣式類(lèi)對(duì)應(yīng)的 class ,就像使用普通屬性一樣。 代碼示例:
<!-- 頁(yè)面的 QML -->
<custom-component my-class="red-text" />
.red-text {
color: red;
}
使組件接受全局樣式 默認(rèn)情況下,自定義組件的樣式只受到自定義組件 qss 的影響。除非以下兩種情況:
addGlobalClass
選項(xiàng),只需要在 Component 構(gòu)造器中將 options.addGlobalClass
字段置為 true
。
注意:當(dāng)激活了addGlobalClass
選項(xiàng)后,存在外部樣式污染組件樣式的風(fēng)險(xiǎn),請(qǐng)謹(jǐn)慎選擇。/* 組件 custom-component.js */
Component({
options: {
addGlobalClass: true,
}
})
<!-- 組件 custom-component.qml -->
<text class="red-text">
這段文本的顏色由 `app.qss` 和頁(yè)面 `qss` 中的樣式定義來(lái)決定
</text>
/* app.qss */
.red-text {
color: red;
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: