09 HarmonyOS NEXT 仿uv-ui Tag組件開發教程系列(三)

溫馨提示:本篇博客的詳細代碼已發布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下載運行哦!


文章目錄

    • Tag組件實戰應用與最佳實踐
      • 1. 復雜場景應用
        • 1.1 標簽篩選系統
      • 2. 性能優化實踐
        • 2.1 狀態管理優化
        • 2.2 渲染性能優化
      • 3. 實用功能擴展
        • 3.1 拖拽排序
        • 3.2 動畫效果
      • 4. 最佳實踐總結
        • 4.1 代碼組織
        • 4.2 測試建議
      • 5. 常見問題解決
    • 總結

Tag組件實戰應用與最佳實踐

1. 復雜場景應用

1.1 標簽篩選系統

// 多選標簽組實現
import { Tag } from "../components/AutoTags"
interface tagGroupClass {groupId: string,title: string,tags: tagClass[]
}
interface tagClass {id: string,text: string,type: stringgroupId?: string
}@Component
export struct FilterTags {@State selectedTags: Set<string> = new Set()@State tagGroups: tagGroupClass[] = [{groupId: 'g1',title: '類型',tags: [{ id: '1', text: '重要', type: 'primary' },{ id: '2', text: '普通', type: 'default' }]},{groupId: 'g2',title: '狀態',tags: [{ id: '3', text: '進行中', type: 'warning' },{ id: '4', text: '已完成', type: 'success' }]}]build() {Column({ space: 16 }) {ForEach(this.tagGroups, (group) => {Column({ space: 8 }) {Text(group.title).fontSize(16).fontWeight(FontWeight.Medium)Flex({ wrap: FlexWrap.Wrap }) {ForEach(group.tags, (tag:tagClass) => {Tag({text: tag.text,type: tag.type ?? 'default'}).onClick(() => {this.handleTagClick(tag.id)})})}}})}}private handleTagClick(tagId: string) {if (this.selectedTags.has(tagId)) {this.selectedTags.delete(tagId)} else {this.selectedTags.add(tagId)}this.notifyFilterChange()}private notifyFilterChange() {// 處理篩選邏輯console.log(`篩選條件:${Array.from(this.selectedTags).join(',')}`)}
}

2. 性能優化實踐

2.1 狀態管理優化
// 優化前
@State private tags: Array<string> = []// 優化后:使用Set提高查找效率
@State private tagSet: Set<string> = new Set()// 優化數據結構
interface TagItem {id: stringtext: stringtype: stringselected?: boolean
}// 使用Map優化查找
@State private tagMap: Map<string, TagItem> = new Map()
2.2 渲染性能優化
@Component
struct OptimizedTags {// 使用@Builder抽取復用組件@Builderprivate TagItem(tag: TagItem) {Tag({text: tag.text,type: tag.type,closable: true}).margin(4)}// 使用懶加載優化大列表渲染build() {List({ space: 8 }) {LazyForEach(this.dataSource, (tag: TagItem) => {ListItem() {this.TagItem(tag)}}, (tag: TagItem) => tag.id)}}
}

3. 實用功能擴展

3.1 拖拽排序
@Component
struct DraggableTags {@State tags: TagClass[] = []@State dragIndex: number = -1build() {Flex({ wrap: FlexWrap.Wrap }) {ForEach(this.tags, (tag, index) => {Tag({text: tag.text,type: tag.type}).gesture(PanGesture().onActionStart(() => {this.dragIndex = index}).onActionUpdate((event: GestureEvent) => {// 處理拖拽邏輯}).onActionEnd(() => {this.dragIndex = -1}))})}}
}
3.2 動畫效果
@Component
struct AnimatedTag {@State private isVisible: boolean = true@State private scale: number = 1build() {Tag({text: '動畫標簽',closable: true,onClose: () => {animateTo({duration: 300,curve: Curve.EaseInOut,onFinish: () => {this.isVisible = false}}, () => {this.scale = 0})}}).scale(this.scale).opacity(this.isVisible ? 1 : 0)}
}

4. 最佳實踐總結

4.1 代碼組織
// 集中管理顏色配置
const TagColors = {text: {default: '#333333',primary: '#2468f2',// ...},background: {default: '#ffffff',primary: '#eef2ff',// ...},// ...
} as const// 抽取通用邏輯
class TagUtils {static getColor(type: string, state: string): string {return Reflect.get(TagColors[state], type) || TagColors[state].default}static validateType(type: string): boolean {return ['default', 'primary', 'success', 'warning', 'danger'].includes(type)}
}
4.2 測試建議
  1. 單元測試
// 測試顏色系統
describe('TagUtils', () => {it('should return correct color', () => {expect(TagUtils.getColor('primary', 'text')).toBe('#2468f2')expect(TagUtils.getColor('invalid', 'text')).toBe('#333333')})it('should validate type correctly', () => {expect(TagUtils.validateType('primary')).toBe(true)expect(TagUtils.validateType('invalid')).toBe(false)})
})
  1. 性能測試
  • 大數據量下的渲染性能
  • 頻繁狀態更新的響應速度
  • 內存占用情況

5. 常見問題解決

  1. 狀態同步問題
// 問題:子組件狀態未同步到父組件
// 解決:使用雙向綁定
@Component
struct ParentComponent {@State tags: TagItem[] = []build() {Column() {ChildTags({ tags: $tags })}}
}@Component
struct ChildTags {@Link tags: TagItem[]// ...
}
  1. 性能問題
// 問題:大量標簽渲染卡頓
// 解決:使用虛擬列表
@Component
struct VirtualTags {private virtualListController: VirtualListController = new VirtualListController()build() {VirtualList({ controller: this.virtualListController }) {ForEach(this.tags, (tag) => {TagItem({ tag })})}}
}

總結

在 HarmonyOS NEXT 仿uv-ui Tag組件開發教程系列中我們從零開始開發了Tag組件, 他的擴展性其實還是存在的, 當然在開發過程中需要注意的是,一定要注意性能優化的問題, 其次在案例源碼中接口類型其實定義在當前的文件中 ,在正式開發的過程中建議創建一個 Types 文件夾 將定義的接口接口放在該文件夾下進行統一管理

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897393.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897393.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897393.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

clickhouse查詢效率低

《關于ClickHouse查詢效率低的探討》 在數據處理的世界里&#xff0c;數據庫扮演著至關重要的角色。ClickHouse是一款專為在線分析處理&#xff08;OLAP&#xff09;設計的列式存儲數據庫管理系統。它因其快速的數據寫入和查詢速度而聞名&#xff0c;尤其適合處理海量數據。如…

Linux系統基于ARM平臺的LVGL移植

軟硬件介紹&#xff1a;Ubuntu 20.04 ARM 和&#xff08;Cortex-A53架構&#xff09;開發板 基本原理 LVGL圖形庫是支持使用Linux系統的Framebuffer幀緩沖設備實現的&#xff0c;如果想要實現在ARM開發板上運行LVGL圖形庫&#xff0c;那么就需要把LVGL圖形庫提供的關于幀緩沖設…

【GPT入門】第14課 openai調用高德地圖案例實現多輪會話與多輪接口調用

【GPT入門】第14課 openai調用高德地圖案例實現多輪會話與多輪接口調用 1.使用openai調用高德地圖API概述2. 高德接口調用申請3.實現代碼(多個function調用,多輪對話)4.執行結果1.使用openai調用高德地圖API概述 任務描述:使用openai調用高德地圖API,實現用戶問地理有關的…

每日一題-----面試

一、什么是孤兒進程&#xff1f;什么是僵尸進程&#xff1f; 1.孤兒進程是指父進程在子進程結束之前就已經退出&#xff0c;導致子進程失去了父進程的管理和控制&#xff0c;成為了 “孤兒”。此時&#xff0c;這些子進程會被系統的 init 進程&#xff08;在 Linux 系統中&…

Python深度學習算法介紹

一、引言 深度學習是機器學習的一個重要分支&#xff0c;它通過構建多層神經網絡結構&#xff0c;自動從數據中學習特征表示&#xff0c;從而實現對復雜模式的識別和預測。Python作為一門強大的編程語言&#xff0c;憑借其簡潔易讀的語法和豐富的庫支持&#xff0c;成為深度學…

【Python】Django 中的算法應用與實現

Django 中的算法應用與實現 在 Django 開發中&#xff0c;算法的應用可以極大地擴展 Web 應用的功能和性能。從簡單的數據處理到復雜的機器學習模型&#xff0c;Django 都可以作為一個強大的后端框架來支持這些算法的實現。本文將介紹幾種常見的算法及其在 Django 中的使用方法…

旋轉編碼器原理與應用詳解:從結構到實戰 | 零基礎入門STM32第四十七步

主題內容教學目的/擴展視頻旋轉編碼器電路原理&#xff0c;跳線設置&#xff0c;結構分析。驅動程序與調用。熟悉電路和驅動程序。 師從洋桃電子&#xff0c;杜洋老師 &#x1f4d1;文章目錄 一、旋轉編碼器是什么&#xff1f;二、內部結構揭秘2.1 機械組件解剖2.2 核心部件說明…

如何禁止電腦中某個應用聯網

一、通過防火墻基礎設置&#xff08;快速操作&#xff09; 打開控制面板 在任務欄搜索框輸入“控制面板”并打開&#xff0c;將右上角“查看方式”切換為“大圖標”。 進入防火墻設置 點擊 Windows Defender防火墻 → 左側選擇 允許應用或功能通過Windows Defender防火墻。…

aws(學習筆記第三十二課) 深入使用cdk(API Gateway + event bridge)

文章目錄 aws(學習筆記第三十二課) 深入使用cdk學習內容&#xff1a;1. 使用aws API Gatewaylambda1.1. 以前的練習1.2. 使用cdk創建API Gateway lambda1.3. 確認cdk創建API Gateway lambda 2. 使用event bridge練習producer和consumer2.1. 代碼鏈接2.2. 開始練習2.3. 代碼部…

城市霓虹燈夜景拍照后期Lr調色教程,手機濾鏡PS+Lightroom預設下載!

調色教程 在城市霓虹燈夜景拍攝中&#xff0c;由于現場光線復雜等因素&#xff0c;照片可能無法完全呈現出當時的視覺感受。通過 Lr 調色&#xff0c;可以彌補拍攝時的不足。例如&#xff0c;運用基本調整面板中的曝光、對比度、陰影等工具&#xff0c;可以處理出畫面的整體明暗…

自然語言處理:文本分類

介紹 大家好&#xff0c;我這個熱衷于分享知識的博主又來啦&#xff01;之前我們一起深入探討了自然語言處理領域中非常重要的兩個方法&#xff1a;樸素貝葉斯和邏輯斯諦回歸。在探索的過程中&#xff0c;我們剖析了樸素貝葉斯如何基于概率原理和特征條件獨立假設&#xff0c;…

PDFMathTranslate安裝使用

PDF全文翻譯&#xff01;&#xff01;&#xff01;&#xff01; PDFMathTranslate安裝使用 它是個啥 PDFMathTranslate 可能是一個用于 PDF 文件的數學公式翻譯 工具。它可能包含以下功能&#xff1a; 提取 PDF 內的數學公式 將數學公式轉換成 LaTeX 代碼 翻譯數學公式的內…

【由技及道】量子構建交響曲:Jenkinsfile流水線的十一維編程藝術【人工智障AI2077的開發日志008】

摘要&#xff1a;當代碼提交觸發時空漣漪&#xff0c;當構建流水線穿越量子維度——歡迎來到自動化構建的終極形態。本文將揭示如何用Jenkinsfile編寫量子構建樂章&#xff0c;讓每次代碼提交都成為跨維度交響樂的音符。 動機&#xff1a;構建系統的量子哲學 “主人啊&#xff…

K8S高可用集群-小白學習之二進制部署(ansible+shell)

一.K8S高可用集群配置概述 序言:本文從一個小白的視角進行K8S的研究和部署,采用二進制的方式是為了更清楚了分解部署流程及了解這個集群是怎么運作的,加上ansible+shell是方便在這個過程中,遇到了問題,我們可以不斷的快速重復部署來測試和研究問題的所在點,本文的架構圖…

【自學筆記】R語言基礎知識點總覽-持續更新

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 R語言基礎知識點總覽1. R語言簡介2. R語言安裝與環境配置3. R語言基礎語法3.1 數據類型3.2 向量與矩陣3.3 數據框與列表 4. 控制結構4.1 條件語句4.2 循環結構 5. 函…

【編譯器】VSCODE搭建ESP32-C3

【編譯器】VSCODE搭建ESP32-C3 文章目錄 [TOC](文章目錄) 前言一、下載配置二、編譯三、燒錄四、參考資料總結 前言 使用工具&#xff1a; 1. 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例可供參考 一、下載配置 安裝IDF&#xff0c;打開例程 二、編譯 三…

通義千問本地配置并實現微調

通義千問本地配置并實現微調 最小Qwen模型大小942mb from modelscope import snapshot_download model_dir = snapshot_download(“qwen/Qwen2.5-0.5B”, cache_dir=“./models2.5”) Qwen2.5-0.5B:942MB from modelscope import snapshot_download model_dir = snapshot_d…

Magento2根據圖片文件包導入產品圖片

圖片包給的圖片文件是子產品的圖片&#xff0c;如下圖&#xff1a;A104255是主產品的sku <?php/*** 根據圖片包導入產品圖片&#xff0c;包含子產品和主產品* 子產品是作為主圖&#xff0c;主產品是作為附加圖片*/use Magento\Framework\App\Bootstrap;include(../app/boot…

力扣146 - LRU緩存

視頻講解 哈希 雙向鏈表 為什么要用雙向鏈表&#xff1f; 快速刪除節點&#xff08;O(1&#xff09;&#xff09; 如果是單鏈表的話&#xff0c;刪除一個節點時&#xff0c;需要從頭遍歷&#xff0c;找到前驅節點&#xff0c;才能修改 prev->next&#xff0c;導致 O(n)…

考研408

是否需要考研&#xff1f; 考研前期準備 目標院校 每年9月10月才會公布 考試時長3小時 數據結構 1.時間復雜度選擇題計算 2.順序表鏈表特點;指針、結構體語法&#xff0c;鏈表結點定義&#xff0c;鏈表頭結點與頭指針,常見的五種鏈 表&#xff0c;鏈表的插入刪除操作;順…