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.mzph.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;链表的插入删除操作;顺…