W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
ArkTS提供了渲染控制的能力。條件渲染可根據(jù)應(yīng)用的不同狀態(tài),使用if、else和else if渲染對應(yīng)狀態(tài)下的UI內(nèi)容。
從API version 9開始,該接口支持在ArkTS卡片中使用。
當(dāng)if、else if后跟隨的狀態(tài)判斷中使用的狀態(tài)變量值變化時(shí),條件渲染語句會(huì)進(jìn)行更新,更新步驟如下:
條件可以包括Typescript表達(dá)式。對于構(gòu)造函數(shù)中的表達(dá)式,此類表達(dá)式不得更改應(yīng)用程序狀態(tài)。
- @Entry
- @Component
- struct ViewA {
- @State count: number = 0;
- build() {
- Column() {
- Text(`count=${this.count}`)
- if (this.count > 0) {
- Text(`count is positive`)
- .fontColor(Color.Green)
- }
- Button('increase count')
- .onClick(() => {
- this.count++;
- })
- Button('decrease count')
- .onClick(() => {
- this.count--;
- })
- }
- }
- }
if語句的每個(gè)分支都包含一個(gè)構(gòu)建函數(shù)。此類構(gòu)建函數(shù)必須創(chuàng)建一個(gè)或多個(gè)子組件。在初始渲染時(shí),if語句會(huì)執(zhí)行構(gòu)建函數(shù),并將生成的子組件添加到其父組件中。
每當(dāng)if或else if條件語句中使用的狀態(tài)變量發(fā)生變化時(shí),條件語句都會(huì)更新并重新評估新的條件值。如果條件值評估發(fā)生了變化,這意味著需要構(gòu)建另一個(gè)條件分支。此時(shí)ArkUI框架將:
在以上示例中,如果count從0增加到1,那么if語句更新,條件count > 0將重新評估,評估結(jié)果將從false更改為true。因此,將執(zhí)行條件為真分支的構(gòu)造函數(shù),創(chuàng)建一個(gè)Text組件,并將它添加到父組件Column中。如果后續(xù)count更改為0,則Text組件將從Column組件中刪除。由于沒有else分支,因此不會(huì)執(zhí)行新的構(gòu)造函數(shù)。
以下示例包含if ... else ...語句與擁有@State裝飾變量的子組件。
- @Component
- struct CounterView {
- @State counter: number = 0;
- label: string = 'unknown';
- build() {
- Row() {
- Text(`${this.label}`)
- Button(`counter ${this.counter} +1`)
- .onClick(() => {
- this.counter += 1;
- })
- }
- }
- }
- @Entry
- @Component
- struct MainView {
- @State toggle: boolean = true;
- build() {
- Column() {
- if (this.toggle) {
- CounterView({ label: 'CounterView #positive' })
- } else {
- CounterView({ label: 'CounterView #negative' })
- }
- Button(`toggle ${this.toggle}`)
- .onClick(() => {
- this.toggle = !this.toggle;
- })
- }
- }
- }
CounterView(label為 'CounterView #positive')子組件在初次渲染時(shí)創(chuàng)建。此子組件攜帶名為counter的狀態(tài)變量。當(dāng)修改CounterView.counter狀態(tài)變量時(shí),CounterView(label為 'CounterView #positive')子組件重新渲染時(shí)并保留狀態(tài)變量值。當(dāng)MainView.toggle狀態(tài)變量的值更改為false時(shí),MainView父組件內(nèi)的if語句將更新,隨后將刪除CounterView(label為 'CounterView #positive')子組件。與此同時(shí),將創(chuàng)建新的CounterView(label為 'CounterView #negative')實(shí)例。而它自己的counter狀態(tài)變量設(shè)置為初始值0。
CounterView(label為 'CounterView #positive')和CounterView(label為 'CounterView #negative')是同一自定義組件的兩個(gè)不同實(shí)例。if分支的更改,不會(huì)更新現(xiàn)有子組件,也不會(huì)保留狀態(tài)。
以下示例展示了條件更改時(shí),若需要保留counter值所做的修改。
- @Component
- struct CounterView {
- @Link counter: number;
- label: string = 'unknown';
- build() {
- Row() {
- Text(`${this.label}`)
- Button(`counter ${this.counter} +1`)
- .onClick(() => {
- this.counter += 1;
- })
- }
- }
- }
- @Entry
- @Component
- struct MainView {
- @State toggle: boolean = true;
- @State counter: number = 0;
- build() {
- Column() {
- if (this.toggle) {
- CounterView({ counter: $counter, label: 'CounterView #positive' })
- } else {
- CounterView({ counter: $counter, label: 'CounterView #negative' })
- }
- Button(`toggle ${this.toggle}`)
- .onClick(() => {
- this.toggle = !this.toggle;
- })
- }
- }
- }
此處,@State counter變量歸父組件所有。因此,當(dāng)CounterView組件實(shí)例被刪除時(shí),該變量不會(huì)被銷毀。CounterView組件通過@Link裝飾器引用狀態(tài)。狀態(tài)必須從子級移動(dòng)到其父級(或父級的父級),以避免在條件內(nèi)容或重復(fù)內(nèi)容被銷毀時(shí)丟失狀態(tài)。
條件語句的嵌套對父組件的相關(guān)規(guī)則沒有影響。
- @Entry
- @Component
- struct CompA {
- @State toggle: boolean = false;
- @State toggleColor: boolean = false;
- build() {
- Column() {
- Text('Before')
- .fontSize(15)
- if (this.toggle) {
- Text('Top True, positive 1 top')
- .backgroundColor('#aaffaa').fontSize(20)
- // 內(nèi)部if語句
- if (this.toggleColor) {
- Text('Top True, Nested True, positive COLOR Nested ')
- .backgroundColor('#00aaaa').fontSize(15)
- } else {
- Text('Top True, Nested False, Negative COLOR Nested ')
- .backgroundColor('#aaaaff').fontSize(15)
- }
- } else {
- Text('Top false, negative top level').fontSize(20)
- .backgroundColor('#ffaaaa')
- if (this.toggleColor) {
- Text('positive COLOR Nested ')
- .backgroundColor('#00aaaa').fontSize(15)
- } else {
- Text('Negative COLOR Nested ')
- .backgroundColor('#aaaaff').fontSize(15)
- }
- }
- Text('After')
- .fontSize(15)
- Button('Toggle Outer')
- .onClick(() => {
- this.toggle = !this.toggle;
- })
- Button('Toggle Inner')
- .onClick(() => {
- this.toggleColor = !this.toggleColor;
- })
- }
- }
- }
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)系方式:
更多建議: