ArkTS四種渲染控制能力

大家好,我是 V 哥。ArkTS 是 HarmonyOS NEXT 開發(fā)的主要開發(fā)語(yǔ)言,提供了聲明式 UI 渲染的能力。下面來(lái)對(duì)ArkTS中四種渲染控制能力: if/else丹禀、ForEachLazyForEachContentSlot 詳細(xì)介紹一下:

1. if/else 渲染控制

if/else 是 ArkTS 提供的基本邏輯控制語(yǔ)法鞋怀,用于 基于條件動(dòng)態(tài)控制組件的渲染湃崩。它的核心用途是根據(jù)某些條件,在運(yùn)行時(shí)決定渲染哪些組件接箫,以及組件的結(jié)構(gòu)或內(nèi)容攒读。以下是它的主要特點(diǎn)和用途的詳細(xì)介紹:

主要用途

  1. 動(dòng)態(tài)顯示或隱藏組件

    • 根據(jù)變量的值,動(dòng)態(tài)控制某些組件是否渲染辛友。
    • 避免不必要的組件渲染薄扁,提高性能。
  2. 實(shí)現(xiàn)多種狀態(tài)的界面切換

    • 適合條件分支較少的場(chǎng)景废累。
    • 在界面上根據(jù)狀態(tài)顯示不同的布局或信息(如登錄狀態(tài)邓梅、加載中狀態(tài)、錯(cuò)誤提示等)邑滨。
  3. 響應(yīng)用戶交互或數(shù)據(jù)變化

    • 基于用戶的操作動(dòng)態(tài)更新界面日缨。
    • 如點(diǎn)擊按鈕后切換視圖,或數(shù)據(jù)加載完成后切換顯示內(nèi)容掖看。
  4. 個(gè)性化內(nèi)容顯示

    • 根據(jù)用戶角色匣距、權(quán)限或其他業(yè)務(wù)邏輯,動(dòng)態(tài)展示不同的組件或內(nèi)容哎壳。

詳細(xì)講解

語(yǔ)法基礎(chǔ)

  • if/else 語(yǔ)法與普通編程語(yǔ)言一致毅待,可以嵌套其他 ArkTS UI 組件。
  • if 用于條件成立時(shí)渲染的組件归榕,else 用于條件不成立時(shí)的渲染尸红。

示例場(chǎng)景與代碼

場(chǎng)景 1:登錄狀態(tài)控制

根據(jù)用戶是否登錄,顯示歡迎信息或登錄提示。

@Entry
@Component
struct LoginExample {
    private isLoggedIn: boolean = false;

    build() {
        Column() {
            // 根據(jù)用戶登錄狀態(tài)顯示不同的內(nèi)容
            if (this.isLoggedIn) {
                Text("歡迎回來(lái)外里,用戶怎爵!").fontSize(20).padding(10)
            } else {
                Text("您尚未登錄,請(qǐng)登錄繼續(xù)操作").fontSize(16).padding(10)
                Button("登錄") {
                    this.isLoggedIn = true; // 登錄后更新狀態(tài)
                }.padding(5)
            }
        }
    }
}

場(chǎng)景 2:加載狀態(tài)切換

顯示加載中的動(dòng)畫或加載完成后的內(nèi)容盅蝗。

@Entry
@Component
struct LoadingExample {
    private isLoading: boolean = true;

    build() {
        Column() {
            // 判斷當(dāng)前是否為加載狀態(tài)
            if (this.isLoading) {
                Text("加載中鳖链,請(qǐng)稍候...").fontSize(18).padding(10)
            } else {
                Text("內(nèi)容加載完成!").fontSize(18).padding(10)
            }

            // 模擬狀態(tài)切換按鈕
            Button("切換狀態(tài)") {
                this.isLoading = !this.isLoading; // 切換加載狀態(tài)
            }.padding(10)
        }
    }
}

場(chǎng)景 3:權(quán)限顯示

根據(jù)用戶權(quán)限等級(jí)展示不同的內(nèi)容风科。

@Entry
@Component
struct PermissionExample {
    private userRole: string = "guest"; // 用戶角色:guest, user, admin

    build() {
        Column() {
            if (this.userRole === "guest") {
                Text("歡迎游客,請(qǐng)注冊(cè)以享受更多功能乞旦。").fontSize(16).padding(10)
            } else if (this.userRole === "user") {
                Text("歡迎普通用戶贼穆,解鎖更多高級(jí)功能升級(jí)為管理員。").fontSize(16).padding(10)
            } else if (this.userRole === "admin") {
                Text("歡迎管理員兰粉,您擁有最高權(quán)限故痊!").fontSize(16).padding(10)
            }

            // 模擬權(quán)限切換按鈕
            Row() {
                Button("設(shè)置為游客") { this.userRole = "guest" }.padding(5)
                Button("設(shè)置為普通用戶") { this.userRole = "user" }.padding(5)
                Button("設(shè)置為管理員") { this.userRole = "admin" }.padding(5)
            }
        }
    }
}

if/else 使用時(shí)的注意事項(xiàng)

  1. 避免復(fù)雜嵌套

    • 嵌套層級(jí)過(guò)深會(huì)影響代碼的可讀性,建議將復(fù)雜邏輯拆分成方法或子組件玖姑。
  2. 性能優(yōu)化

    • if/else 不會(huì)渲染未滿足條件的組件愕秫,因此可以利用該特性控制渲染數(shù)量,避免浪費(fèi)資源焰络。
  3. 配合狀態(tài)管理

    • 可以結(jié)合 State@Observed 數(shù)據(jù)模型戴甩,實(shí)現(xiàn)更靈活的動(dòng)態(tài)渲染。

if/else 是 ArkTS 中最基礎(chǔ)的控制語(yǔ)法闪彼,通過(guò)動(dòng)態(tài)切換組件的渲染路徑甜孤,可以靈活應(yīng)對(duì)各種場(chǎng)景下的界面需求,使開發(fā)者能夠快速實(shí)現(xiàn)邏輯清晰畏腕、性能優(yōu)異的動(dòng)態(tài) UI缴川。


2. ForEach 渲染控制

ForEach 是 ArkTS 提供的一種迭代語(yǔ)法,專用于遍歷固定或小規(guī)模的數(shù)據(jù)集合描馅,并基于集合的每個(gè)元素動(dòng)態(tài)生成 UI 組件把夸。它在開發(fā)中扮演著重要角色,尤其是需要根據(jù)數(shù)組或列表生成界面內(nèi)容時(shí)铭污。

主要用途

  1. 動(dòng)態(tài)渲染組件列表

    • 根據(jù)數(shù)據(jù)集合的元素恋日,生成對(duì)應(yīng)的組件。
    • 適合中小規(guī)模的靜態(tài)或動(dòng)態(tài)數(shù)據(jù)集合嘹狞。
  2. 數(shù)據(jù)驅(qū)動(dòng)的視圖更新

    • 數(shù)據(jù)集合發(fā)生改變(增刪改)時(shí)谚鄙,ForEach 會(huì)自動(dòng)更新渲染內(nèi)容,保證視圖與數(shù)據(jù)同步刁绒。
  3. 可配置的動(dòng)態(tài)視圖

    • 使用相同的組件模板闷营,為不同的數(shù)據(jù)生成獨(dú)特的內(nèi)容或樣式。
  4. 清晰的邏輯分離

    • 數(shù)據(jù)與視圖邏輯解耦,通過(guò)數(shù)據(jù)集合定義 UI傻盟,避免手動(dòng)創(chuàng)建多個(gè)類似組件速蕊。

語(yǔ)法

基本語(yǔ)法

ForEach(array, (item) => {
    // 渲染邏輯
})

參數(shù)

  • array:要遍歷的數(shù)組或集合。
  • (item):當(dāng)前元素的引用娘赴,可用于組件內(nèi)容的動(dòng)態(tài)生成规哲。

示例與場(chǎng)景講解

場(chǎng)景 1:簡(jiǎn)單列表渲染

示例:展示水果名稱的簡(jiǎn)單列表。

@Entry
@Component
struct SimpleListExample {
    private fruits: string[] = ["蘋果", "香蕉", "橘子", "葡萄"];

    build() {
        Column() {
            ForEach(this.fruits, (fruit) => {
                Text(fruit).fontSize(20).padding(5)
            })
        }
    }
}

解析

  • 遍歷 fruits 數(shù)組诽表,動(dòng)態(tài)生成每個(gè) Text 組件唉锌。
  • 當(dāng) fruits 數(shù)組發(fā)生變化時(shí)(增刪項(xiàng)),界面會(huì)自動(dòng)更新竿奏。

場(chǎng)景 2:帶索引的列表渲染

示例:顯示帶序號(hào)的城市列表袄简。

@Entry
@Component
struct IndexedListExample {
    private cities: string[] = ["北京", "上海", "廣州", "深圳"];

    build() {
        Column() {
            ForEach(this.cities, (city, index) => {
                Text(`${index + 1}. ${city}`).fontSize(18).padding(5)
            })
        }
    }
}

解析

  • 使用 index 顯示當(dāng)前元素的序號(hào)。
  • 可以動(dòng)態(tài)綁定索引值到 UI泛啸。

場(chǎng)景 3:復(fù)雜數(shù)據(jù)對(duì)象渲染

示例:渲染用戶信息卡片绿语。

interface User {
    name: string;
    age: number;
}

@Entry
@Component
struct UserListExample {
    private users: User[] = [
        { name: "張三", age: 25 },
        { name: "李四", age: 30 },
        { name: "王五", age: 28 }
    ];

    build() {
        Column() {
            ForEach(this.users, (user) => {
                Column() {
                    Text(`姓名:${user.name}`).fontSize(18)
                    Text(`年齡:${user.age}`).fontSize(16).padding(2)
                }.padding(10).border(Color.Gray, 1).margin(5)
            })
        }
    }
}

解析

  • 遍歷 users 數(shù)組,每個(gè)元素生成一個(gè)用戶信息卡片候址。
  • 通過(guò) Column 嵌套展示每個(gè)用戶的屬性信息吕粹。

場(chǎng)景 4:動(dòng)態(tài)列表(增刪項(xiàng))

示例:實(shí)現(xiàn)可以增刪項(xiàng)目的任務(wù)列表。

@Entry
@Component
struct DynamicListExample {
    private tasks: string[] = ["完成報(bào)告", "開會(huì)", "整理資料"];

    build() {
        Column() {
            // 渲染任務(wù)列表
            ForEach(this.tasks, (task, index) => {
                Row() {
                    Text(task).fontSize(18).padding(5)
                    Button("刪除") {
                        this.tasks.splice(index, 1); // 刪除對(duì)應(yīng)任務(wù)
                    }.padding(5)
                }
            })

            // 添加新任務(wù)的輸入框和按鈕
            Row() {
                TextField({ placeholder: "輸入新任務(wù)" }).onChange((value) => {
                    this.newTask = value;
                }).width('70%')
                Button("添加任務(wù)") {
                    if (this.newTask.trim() !== "") {
                        this.tasks.push(this.newTask.trim());
                    }
                }.padding(5)
            }.margin(10)
        }
    }

    private newTask: string = ""; // 輸入的新任務(wù)內(nèi)容
}

解析

  • 使用 ForEach 渲染 tasks 列表岗仑。
  • tasks 數(shù)據(jù)更新時(shí)叮盘,UI 會(huì)同步變更挽绩。
  • 提供輸入框和按鈕以動(dòng)態(tài)添加或刪除任務(wù)柜砾。

注意事項(xiàng)

  1. 適用于小規(guī)模數(shù)據(jù)集合

    • ForEach 適合幾百條以內(nèi)的數(shù)據(jù)厘肮,數(shù)據(jù)量特別大時(shí)建議使用 LazyForEach
  2. 保持?jǐn)?shù)據(jù)唯一性

    • 遍歷的數(shù)據(jù)集合應(yīng)盡量保持唯一標(biāo)識(shí)(如索引或 ID)舞虱,避免意外更新或視圖錯(cuò)亂欢际。
  3. 避免過(guò)深嵌套

    • 如果 ForEach 嵌套過(guò)多,可能導(dǎo)致代碼不易維護(hù)矾兜,建議拆分為子組件损趋。

通過(guò) ForEach 渲染控制,開發(fā)者能夠快速生成基于數(shù)據(jù)的動(dòng)態(tài) UI椅寺,滿足各種場(chǎng)景下的靈活需求浑槽,從靜態(tài)內(nèi)容到動(dòng)態(tài)交互都可以輕松實(shí)現(xiàn)。

3. LazyForEach 渲染控制

LazyForEach 是 ArkTS 提供的一種高效迭代語(yǔ)法返帕,專為 大規(guī)模桐玻、動(dòng)態(tài)數(shù)據(jù)集合 設(shè)計(jì),通過(guò) 延遲加載 的機(jī)制荆萤,按需渲染可見范圍內(nèi)的組件镊靴,從而顯著提高性能铣卡。

主要用途

  1. 大規(guī)模數(shù)據(jù)的高效渲染

    • 當(dāng)數(shù)據(jù)集合規(guī)模較大(如數(shù)千條以上),LazyForEach 能避免一次性加載所有組件偏竟,從而節(jié)省內(nèi)存和渲染時(shí)間煮落。
  2. 按需加載數(shù)據(jù)

    • 根據(jù)當(dāng)前視圖的可見范圍,僅渲染需要顯示的內(nèi)容踊谋,未進(jìn)入視圖的部分不會(huì)占用計(jì)算資源蝉仇。
  3. 支持動(dòng)態(tài)增刪數(shù)據(jù)

    • 當(dāng)數(shù)據(jù)集合動(dòng)態(tài)變化(增刪、更新)時(shí)殖蚕,LazyForEach 會(huì)自動(dòng)優(yōu)化渲染流程轿衔,保持性能穩(wěn)定。
  4. 流暢的用戶體驗(yàn)

    • 在需要滾動(dòng)查看長(zhǎng)列表(如聊天記錄睦疫、商品列表)時(shí)害驹,延遲加載機(jī)制保證了操作的流暢性。

語(yǔ)法

先來(lái)看一下基本語(yǔ)法

LazyForEach(array, (item, index) => {
    // 渲染邏輯
})

參數(shù)

  • array:需要遍歷的大規(guī)模數(shù)據(jù)集合笼痛。
  • (item, index):當(dāng)前數(shù)據(jù)元素及其索引裙秋,傳遞給渲染邏輯琅拌。

示例與場(chǎng)景講解

場(chǎng)景 1:大規(guī)模數(shù)據(jù)的列表渲染

示例:顯示 1,000 條用戶消息記錄缨伊。

@Entry
@Component
struct LargeDataExample {
    private messages: string[] = Array.from({ length: 1000 }, (_, i) => `消息 ${i + 1}`);

    build() {
        LazyForEach(this.messages, (message) => {
            Text(message).fontSize(18).padding(5)
        })
    }
}

解析

  • 數(shù)據(jù)集合 messages 包含 1,000 條消息。
  • LazyForEach 會(huì)根據(jù)可見范圍按需渲染消息內(nèi)容进宝,減少一次性渲染的負(fù)擔(dān)刻坊,保證性能流暢。

場(chǎng)景 2:動(dòng)態(tài)加載商品列表

示例:實(shí)現(xiàn)商品列表的無(wú)限滾動(dòng)加載党晋。

@Entry
@Component
struct InfiniteScrollExample {
    private products: string[] = Array.from({ length: 20 }, (_, i) => `商品 ${i + 1}`);
    private pageCount: number = 1;

    build() {
        Column() {
            LazyForEach(this.products, (product) => {
                Text(product).fontSize(16).padding(10)
            })

            Button("加載更多") {
                this.loadMoreProducts(); // 加載更多商品
            }.padding(10)
        }
    }

    private loadMoreProducts() {
        // 模擬每次加載 20 個(gè)商品
        this.pageCount += 1;
        const newProducts = Array.from({ length: 20 }, (_, i) => `商品 ${i + 1 + this.products.length}`);
        this.products.push(...newProducts);
    }
}

解析

  • 初始數(shù)據(jù)為 20 個(gè)商品谭胚,點(diǎn)擊按鈕后動(dòng)態(tài)加載更多商品。
  • LazyForEach 按需渲染新增的內(nèi)容未玻,保持性能穩(wěn)定灾而。

場(chǎng)景 3:聊天消息界面

示例:渲染實(shí)時(shí)更新的聊天消息。

@Entry
@Component
struct ChatExample {
    private messages: { sender: string; content: string }[] = [
        { sender: "用戶A", content: "你好" },
        { sender: "用戶B", content: "你好扳剿!有事嗎旁趟?" }
    ];

    build() {
        LazyForEach(this.messages, (message) => {
            Column() {
                Text(`${message.sender}:`).fontSize(14).fontWeight(FontWeight.Bold).padding(2)
                Text(message.content).fontSize(16).padding(5)
            }.padding(10).border(Color.Gray, 1).margin(5)
        })
    }

    addMessage(sender: string, content: string) {
        this.messages.push({ sender, content });
    }
}

解析

  • 聊天消息實(shí)時(shí)追加到數(shù)據(jù)集合 messages 中。
  • LazyForEach 僅渲染當(dāng)前可見區(qū)域的消息庇绽,確保滾動(dòng)和渲染的流暢性锡搜。

場(chǎng)景 4:渲染含圖片的大規(guī)模數(shù)據(jù)

示例:展示 500 張商品圖片列表。

@Entry
@Component
struct ImageGridExample {
    private images: string[] = Array.from({ length: 500 }, (_, i) => `https://example.com/image${i + 1}.jpg`);

    build() {
        LazyForEach(this.images, (imageUrl) => {
            Image(imageUrl).width(100).height(100).margin(5)
        })
    }
}

解析

  • 渲染圖片時(shí)內(nèi)存消耗較高瞧掺,LazyForEach 可以有效避免加載所有圖片造成的卡頓耕餐。
  • 僅在用戶滾動(dòng)到圖片所在位置時(shí)加載對(duì)應(yīng)內(nèi)容。

LazyForEach 的優(yōu)勢(shì)

  1. 性能優(yōu)化

    • 避免一次性渲染整個(gè)數(shù)據(jù)集合辟狈,顯著減少內(nèi)存和 CPU 的占用肠缔。
    • 在數(shù)據(jù)規(guī)模較大時(shí)(如幾千條以上),相比 ForEach 更高效。
  2. 按需更新

    • 渲染機(jī)制基于用戶可見范圍桩砰,動(dòng)態(tài)更新界面內(nèi)容拓春。
  3. 適應(yīng)動(dòng)態(tài)數(shù)據(jù)

    • 動(dòng)態(tài)增刪數(shù)據(jù)集合中的元素時(shí),LazyForEach 無(wú)需手動(dòng)干預(yù)亚隅,即可自動(dòng)優(yōu)化硼莽。

注意事項(xiàng)

  1. 適用場(chǎng)景

    • 推薦:用于大規(guī)模數(shù)據(jù)集合(數(shù)百條及以上),如聊天記錄煮纵、長(zhǎng)列表懂鸵、圖片網(wǎng)格等。
    • 非必要:若數(shù)據(jù)規(guī)模較行惺琛(幾百條以內(nèi))匆光,可以使用 ForEach,避免引入額外復(fù)雜性酿联。
  2. 視圖更新

    • 當(dāng)數(shù)據(jù)集合變化較頻繁時(shí)终息,確保數(shù)據(jù)的唯一標(biāo)識(shí)(如索引或 ID)以避免視圖錯(cuò)亂。
  3. 資源管理

    • 如果渲染內(nèi)容包含較大的資源(如圖片贞让、視頻)周崭,需要適當(dāng)處理資源加載與釋放。

LazyForEach 是 ArkTS 中不可或缺的渲染工具喳张,它以延遲加載的機(jī)制為大規(guī)模動(dòng)態(tài)數(shù)據(jù)集合的顯示提供了性能保障续镇,同時(shí)保證用戶交互的流暢體驗(yàn)。在開發(fā)長(zhǎng)列表或大規(guī)模數(shù)據(jù)的應(yīng)用時(shí)销部,它能顯著提高開發(fā)效率和應(yīng)用性能摸航。

4. ContentSlot 渲染控制

ContentSlot 是 ArkTS 提供的一種 插槽渲染機(jī)制,用于在組件中動(dòng)態(tài)插入子組件內(nèi)容舅桩。它允許父組件定義占位區(qū)域酱虎,子組件可以通過(guò)插槽填充動(dòng)態(tài)內(nèi)容。類似于前端開發(fā)中的 slotchildren 概念擂涛,ContentSlot 提高了組件的復(fù)用性和靈活性读串。

主要用途

  1. 組件內(nèi)容動(dòng)態(tài)填充

    • 通過(guò)占位插槽機(jī)制,父組件定義好插槽位置歼指,具體內(nèi)容由子組件或外部動(dòng)態(tài)提供爹土。
  2. 高復(fù)用性組件開發(fā)

    • 設(shè)計(jì)通用組件時(shí),開發(fā)者可以通過(guò)插槽允許自定義內(nèi)容插入踩身,例如按鈕胀茵、彈窗等。
  3. 父子組件的靈活傳遞

    • ContentSlot 使父組件與子組件的內(nèi)容解耦挟阻,減少硬編碼的限制琼娘。
  4. 提升內(nèi)容擴(kuò)展能力

    • 插槽內(nèi)容可以根據(jù)需求靈活調(diào)整峭弟,適應(yīng)不同場(chǎng)景的 UI 設(shè)計(jì)。

語(yǔ)法

定義插槽

ContentSlot("slotName", defaultContent)

填充插槽

Column() {
    CustomComponent {
        slotName: Text("我是WG")
    }
}
  • slotName:插槽的名稱脱拼,父組件通過(guò)這個(gè)名稱標(biāo)識(shí)插槽位置瞒瘸。
  • defaultContent:默認(rèn)顯示的內(nèi)容,如果未插入內(nèi)容熄浓,將使用該內(nèi)容情臭。

示例與場(chǎng)景講解

場(chǎng)景 1:動(dòng)態(tài)按鈕內(nèi)容

示例:創(chuàng)建一個(gè)按鈕組件,支持動(dòng)態(tài)插入內(nèi)容(如文本或圖標(biāo))赌蔑。

@Entry
@Component
struct ButtonWithSlot {
    build() {
        Column() {
            // 使用默認(rèn)內(nèi)容
            CustomButton()
            
            // 動(dòng)態(tài)插入內(nèi)容
            CustomButton {
                contentSlot: Text("提交").fontSize(18).fontWeight(FontWeight.Bold)
            }
        }
    }
}

@Component
struct CustomButton {
    build() {
        Row()
            .backgroundColor(Color.Blue)
            .padding(10)
            .alignItems(HorizontalAlign.Center)
            .borderRadius(5) {
            ContentSlot("contentSlot", Text(" 點(diǎn)我一下試試").fontSize(16).color(Color.White))
        }
    }
}

解析

  • CustomButton 是一個(gè)通用按鈕組件俯在,使用 ContentSlot 定義插槽 contentSlot
  • 默認(rèn)插槽內(nèi)容為 "默認(rèn)按鈕"娃惯,外部可以動(dòng)態(tài)插入不同的內(nèi)容跷乐,如 "提交"。

場(chǎng)景 2:可擴(kuò)展的彈窗組件

示例:實(shí)現(xiàn)一個(gè)通用彈窗趾浅,支持動(dòng)態(tài)插入標(biāo)題和內(nèi)容愕提。

@Entry
@Component
struct PopupWithSlotExample {
    private isVisible: boolean = true;

    build() {
        if (this.isVisible) {
            Popup {
                titleSlot: Text("彈窗標(biāo)題:點(diǎn)了又能怎樣").fontSize(20).fontWeight(FontWeight.Bold),
                contentSlot: Text("這是彈窗的內(nèi)容:不怎么樣,你贏了").fontSize(16).padding(10)
            }
        }
    }
}

@Component
struct Popup {
    build() {
        Column()
            .backgroundColor(Color.White)
            .padding(20)
            .borderRadius(10) {
            ContentSlot("titleSlot", Text("默認(rèn)標(biāo)題").fontSize(18).color(Color.Black))
            Divider().backgroundColor(Color.Gray).height(1).margin(10, 0)
            ContentSlot("contentSlot", Text("默認(rèn)內(nèi)容").fontSize(14).color(Color.Gray))
        }
    }
}

解析

  • Popup 是一個(gè)彈窗組件皿哨,定義了 titleSlotcontentSlot 兩個(gè)插槽浅侨。
  • 父組件 PopupWithSlotExample 通過(guò)插槽填充標(biāo)題和內(nèi)容,外部組件可以靈活調(diào)整彈窗內(nèi)容往史。

場(chǎng)景 3:動(dòng)態(tài)卡片組件

示例:實(shí)現(xiàn)一個(gè)支持自定義圖片和文字內(nèi)容的卡片組件仗颈。

@Entry
@Component
struct CardSlotExample {
    build() {
        Card {
            imageSlot: Image("https://xxxxx.com/image.jpg").width(100).height(100),
            textSlot: Text("自定義卡片內(nèi)容").fontSize(18).padding(10)
        }
    }
}

@Component
struct Card {
    build() {
        Column()
            .backgroundColor(Color.LightGray)
            .padding(10)
            .borderRadius(8)
            .alignItems(HorizontalAlign.Center) {
            ContentSlot("imageSlot", Image("").width(50).height(50))
            ContentSlot("textSlot", Text("默認(rèn)卡片內(nèi)容").fontSize(16).color(Color.Black))
        }
    }
}

解析

  • Card 定義了 imageSlottextSlot佛舱,允許父組件動(dòng)態(tài)插入圖片和文字內(nèi)容椎例。
  • 父組件通過(guò)填充插槽,自定義卡片的具體顯示內(nèi)容请祖。

ContentSlot 的優(yōu)勢(shì)

  1. 靈活性

    • 插槽內(nèi)容完全由外部定義订歪,組件可以適應(yīng)多種使用場(chǎng)景。
  2. 高復(fù)用性

    • 通用組件開發(fā)中肆捕,通過(guò) ContentSlot 提供內(nèi)容插入點(diǎn)刷晋,大大提高組件的復(fù)用性。
  3. 內(nèi)容解耦

    • 父組件負(fù)責(zé)插槽定義慎陵,子組件填充具體內(nèi)容眼虱,減少代碼耦合。
  4. 默認(rèn)內(nèi)容支持

    • 插槽未填充時(shí)席纽,顯示默認(rèn)內(nèi)容捏悬,保證組件的完整性和容錯(cuò)性。

注意事項(xiàng)

  1. 插槽命名

    • 插槽名稱應(yīng)具有描述性润梯,避免重名導(dǎo)致內(nèi)容錯(cuò)亂过牙。
  2. 默認(rèn)內(nèi)容設(shè)置

    • 始終為插槽提供默認(rèn)內(nèi)容甥厦,防止外部未填充時(shí)出現(xiàn)空白區(qū)域。
  3. 復(fù)雜嵌套場(chǎng)景

    • 在嵌套組件中使用 ContentSlot 時(shí)寇钉,保持插槽結(jié)構(gòu)清晰刀疙,避免邏輯混亂。

ContentSlot 為 ArkTS 的組件設(shè)計(jì)提供了高度的擴(kuò)展能力扫倡,開發(fā)者可以通過(guò)它實(shí)現(xiàn)動(dòng)態(tài)化和模塊化的組件設(shè)計(jì)谦秧。無(wú)論是按鈕、彈窗撵溃,還是復(fù)雜的卡片組件油够,ContentSlot 都能讓內(nèi)容的插入變得簡(jiǎn)單而高效。


小結(jié)一下

控制方式 功能 典型應(yīng)用場(chǎng)景
if/else 條件控制渲染組件的顯示與隱藏 動(dòng)態(tài)顯示狀態(tài)內(nèi)容(如登錄/未登錄狀態(tài))
ForEach 遍歷小規(guī)模數(shù)據(jù)集合渲染組件 渲染固定數(shù)量的列表
LazyForEach 延遲渲染大規(guī)模數(shù)據(jù)集合 動(dòng)態(tài)加載的長(zhǎng)列表(如消息征懈、數(shù)據(jù)流)
ContentSlot 支持動(dòng)態(tài)插入子組件 插槽設(shè)計(jì)石咬,實(shí)現(xiàn)組件內(nèi)容的動(dòng)態(tài)拓展

我們可以充分利用 ArkTS 提供的聲明式渲染控制能力,提升應(yīng)用的靈活性與性能卖哎。關(guān)注威哥愛(ài)編程鬼悠,鴻蒙千帆起。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末亏娜,一起剝皮案震驚了整個(gè)濱河市焕窝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌维贺,老刑警劉巖它掂,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異溯泣,居然都是意外死亡虐秋,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門垃沦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)客给,“玉大人,你說(shuō)我怎么就攤上這事肢簿“薪#” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵池充,是天一觀的道長(zhǎng)桩引。 經(jīng)常有香客問(wèn)我,道長(zhǎng)收夸,這世上最難降的妖魔是什么坑匠? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮咱圆,結(jié)果婚禮上笛辟,老公的妹妹穿的比我還像新娘功氨。我一直安慰自己,他們只是感情好手幢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布捷凄。 她就那樣靜靜地躺著,像睡著了一般围来。 火紅的嫁衣襯著肌膚如雪跺涤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天监透,我揣著相機(jī)與錄音桶错,去河邊找鬼。 笑死胀蛮,一個(gè)胖子當(dāng)著我的面吹牛院刁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粪狼,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼退腥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了再榄?” 一聲冷哼從身側(cè)響起狡刘,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎困鸥,沒(méi)想到半個(gè)月后嗅蔬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疾就,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年澜术,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虐译。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瘪板,死狀恐怖吴趴,靈堂內(nèi)的尸體忽然破棺而出漆诽,到底是詐尸還是另有隱情,我是刑警寧澤锣枝,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布厢拭,位于F島的核電站,受9級(jí)特大地震影響撇叁,放射性物質(zhì)發(fā)生泄漏供鸠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一陨闹、第九天 我趴在偏房一處隱蔽的房頂上張望楞捂。 院中可真熱鬧薄坏,春花似錦、人聲如沸寨闹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)繁堡。三九已至沈善,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間椭蹄,已是汗流浹背闻牡。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绳矩,地道東北人罩润。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像翼馆,于是被迫代替她去往敵國(guó)和親哨啃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容