当前位置: 首页 > news >正文

HarmonyOS APP<玩转React>开源教程十九:CodeBlock 代码块组件

第19次:CodeBlock 代码块组件

代码展示是编程教程的核心功能。本次课程将开发 CodeBlock 组件,实现代码展示、复制功能和 Toast 提示反馈。


项目效果





学习目标

  • 掌握代码展示组件设计
  • 学会使用等宽字体
  • 实现代码复制功能
  • 使用剪贴板 API
  • 实现 Toast 提示反馈

19.1 代码展示设计

组件结构

┌─────────────────────────────────────────┐ │ 标题 JSX 📋 │ ← 标题栏 ├─────────────────────────────────────────┤ │ function Example() { │ │ return <div>Hello</div>; │ ← 代码区域 │ } │ ├─────────────────────────────────────────┤ │ 💡 这是一个简单的函数组件示例 │ ← 解释说明 └─────────────────────────────────────────┘

Props 定义

@Componentexportstruct CodeBlock{@Propcode:string='';// 代码内容@Proplanguage:string='javascript';// 编程语言@Proptitle:string='';// 标题@Propexplanation:string='';// 解释说明@StorageLink('isDarkMode')isDarkMode:boolean=false;}

19.2 标题栏实现

标题栏布局

@BuilderTitleBar(){Row(){// 标题Text(this.title).fontSize(14).fontWeight(FontWeight.Medium).fontColor(this.isDarkMode?'#ffffff':'#1a1a2e')Blank()// 语言标签Text(this.language.toUpperCase()).fontSize(11).fontColor('#61DAFB').backgroundColor(this.isDarkMode?'rgba(97,218,251,0.2)':'rgba(97,218,251,0.1)').padding({left:6,right:6,top:2,bottom:2}).borderRadius(4)// 复制按钮Text('📋').fontSize(16).margin({left:12}).onClick(()=>this.copyCode())}.width('100%').padding({left:12,right:12,top:8,bottom:8}).backgroundColor(this.isDarkMode?'#1e1e1e':'#f1f3f5').borderRadius({topLeft:12,topRight:12})}

条件显示标题栏

if(this.title){this.TitleBar()}

19.3 代码区域实现

等宽字体

代码展示必须使用等宽字体(monospace),确保代码对齐:

Text(this.code).fontSize(13).fontFamily('monospace')// 等宽字体.fontColor(this.isDarkMode?'#e6e6e6':'#24292e')

可滚动代码区域

Scroll(){Text(this.code).fontSize(13).fontFamily('monospace').fontColor(this.isDarkMode?'#e6e6e6':'#24292e').width('100%').padding(12)}.width('100%').constraintSize({maxHeight:300})// 限制最大高度.backgroundColor(this.isDarkMode?'#282c34':'#f6f8fa').borderRadius(this.title?{bottomLeft:12,bottomRight:12}:12).scrollBar(BarState.Auto)// 自动显示滚动条

constraintSize 约束

使用constraintSize限制代码区域的最大高度,超出时显示滚动条:

.constraintSize({maxHeight:300,// 最大高度 300minHeight:50// 最小高度 50})

19.4 代码复制功能

剪贴板 API

HarmonyOS 提供@kit.BasicServicesKit中的pasteboard模块操作剪贴板:

import{pasteboard}from'@kit.BasicServicesKit';

复制实现

privatecopyCode():void{try{// 创建剪贴板数据constpasteboardData=pasteboard.createData(pasteboard.MIMETYPE_TEXT_PLAIN,// MIME 类型this.code// 数据内容);// 获取系统剪贴板constsystemPasteboard=pasteboard.getSystemPasteboard();// 设置数据到剪贴板systemPasteboard.setData(pasteboardData);// 显示成功提示promptAction.showToast({message:'代码已复制'});}catch(error){console.error('[CodeBlock] Failed to copy:',error);promptAction.showToast({message:'复制失败'});}}

MIME 类型

类型说明
MIMETYPE_TEXT_PLAIN纯文本
MIMETYPE_TEXT_HTMLHTML 文本
MIMETYPE_TEXT_URIURI

19.5 Toast 提示反馈

promptAction API

import{promptAction}from'@kit.ArkUI';

showToast 方法

promptAction.showToast({message:'代码已复制',// 提示文本duration:2000,// 显示时长(毫秒)bottom:100// 距底部距离});

参数说明

参数类型说明
messagestring提示文本
durationnumber显示时长,默认 1500ms
bottomnumber距底部距离

19.6 解释说明区域

实现代码

if(this.explanation){Text(this.explanation).fontSize(13).fontColor(this.isDarkMode?'#d1d5db':'#495057').padding(12).width('100%').backgroundColor(this.isDarkMode?'rgba(97,218,251,0.1)':'rgba(97,218,251,0.05)').borderRadius({bottomLeft:12,bottomRight:12})}

19.7 完整组件代码

/** * 代码块组件 * 支持语法高亮和复制功能 */import{pasteboard}from'@kit.BasicServicesKit';import{promptAction}from'@kit.ArkUI';@Componentexportstruct CodeBlock{@Propcode:string='';@Proplanguage:string='javascript';@Proptitle:string='';@Propexplanation:string='';@StorageLink('isDarkMode')isDarkMode:boolean=false;build(){Column(){// 标题栏(如果有标题)if(this.title){Row(){Text(this.title).fontSize(14).fontWeight(FontWeight.Medium).fontColor(this.isDarkMode?'#ffffff':'#1a1a2e')Blank()// 语言标签Text(this.language.toUpperCase()).fontSize(11).fontColor('#61DAFB').backgroundColor(this.isDarkMode?'rgba(97,218,251,0.2)':'rgba(97,218,251,0.1)').padding({left:6,right:6,top:2,bottom:2}).borderRadius(4)// 复制按钮Text('📋').fontSize(16).margin({left:12}).onClick(()=>this.copyCode())}.width('100%').padding({left:12,right:12,top:8,bottom:8}).backgroundColor(this.isDarkMode?'#1e1e1e':'#f1f3f5').borderRadius({topLeft:12,topRight:12})}// 代码区域Scroll(){Text(this.code).fontSize(13).fontFamily('monospace').fontColor(this.isDarkMode?'#e6e6e6':'#24292e').width('100%').padding(12)}.width('100%').constraintSize({maxHeight:300}).backgroundColor(this.isDarkMode?'#282c34':'#f6f8fa').borderRadius(this.title?{bottomLeft:12,bottomRight:12}:12).scrollBar(BarState.Auto)// 解释说明if(this.explanation){Text(this.explanation).fontSize(13).fontColor(this.isDarkMode?'#d1d5db':'#495057').padding(12).width('100%').backgroundColor(this.isDarkMode?'rgba(97,218,251,0.1)':'rgba(97,218,251,0.05)').borderRadius({bottomLeft:12,bottomRight:12})}}.width('100%').borderRadius(12).clip(true)}privatecopyCode():void{try{constpasteboardData=pasteboard.createData(pasteboard.MIMETYPE_TEXT_PLAIN,this.code);constsystemPasteboard=pasteboard.getSystemPasteboard();systemPasteboard.setData(pasteboardData);promptAction.showToast({message:'代码已复制'});}catch(error){console.error('[CodeBlock] Failed to copy:',error);promptAction.showToast({message:'复制失败'});}}}

19.8 使用示例

// 在课程详情页中使用CodeBlock({code:`function Welcome({ name }) { return <h1>Hello, {name}!</h1>; }`,language:'jsx',title:'函数组件示例',explanation:'这是一个接收 name 属性的函数组件'})

本次课程小结

通过本次课程,你已经:

✅ 掌握了代码展示组件设计
✅ 学会了使用等宽字体
✅ 实现了代码复制功能
✅ 使用了剪贴板 API
✅ 实现了 Toast 提示反馈


课后练习

  1. 添加行号:为代码添加行号显示

  2. 添加语法高亮:实现简单的关键字高亮

  3. 添加展开/收起:长代码支持展开收起


下次预告

第20次:收藏功能实现

我们将开发收藏功能:

  • BookmarkService 设计
  • 收藏状态管理
  • 收藏列表持久化
  • 收藏页面实现

实现课程收藏功能!

http://www.cnnetsun.cn/news/1431059.html

相关文章:

  • 再生龙实战:Linux系统备份与还原全流程解析
  • Polars实战:用泰坦尼克号数据集手把手教你高效数据分析(附完整代码)
  • RISC-V架构下的BL602开发:如何快速上手并优化你的IoT项目
  • 74HC595移位寄存器Arduino驱动库sreg详解
  • GD32F470驱动ILI9488 4.0寸TFT液晶屏实战指南
  • Hunyuan模型支持捷克语吗?中东欧语言部署实测
  • 零基础5分钟搞定:Ollama一键部署Llama-3.2-3B,开启你的AI文本助手
  • 松灵机器人二次开发实战:从零搭建Ubuntu20.4环境到ROS包部署(避坑指南)
  • CosyVoice3功能体验:不仅克隆声音,还能控制方言、情感、多音字发音
  • Qt6与fcitx5的兼容性实战:解决Ubuntu中文输入那些坑(附动态库编译技巧)
  • 你的手机定位到底有多准?揭秘GPS民用级与测绘级精度的关键差异
  • VsCode免密SSH连接Linux服务器:5分钟搞定密钥配置(附常见错误排查)
  • 基于深度学习的玉米虫害检测系统(YOLOv12/v11/v8/v5模型+django)(源码+lw+部署文档+讲解等)
  • ASR技术演进:从传统模型到现代大模型的全面解析
  • 从源码变迁看PX4 Offboard控制:对比v1.11.3与v1.12.0在Mavros指令处理上的重大优化
  • CasRel模型Anaconda安装与环境管理:创建可复现的NLP开发环境
  • Qt+FFmpeg实战:如何给监控视频批量添加动态时间戳(附完整代码)
  • Soldered INA219电流电压传感器Arduino库详解
  • HFI高频注入仿真:直接转矩控制与滑模观测器MATLAB仿真模型
  • 系统优化实战:调用UNIT-00分析并生成C盘深度清理方案
  • SOONet模型网站集成案例:为在线教育平台添加视频知识点定位功能
  • JY61P姿态传感器从入门到精通:手把手教你完成硬件连接与校准(附常见问题排查)
  • 3分钟掌握Steam清单下载:新手必备的极简工具使用全攻略
  • 5个终极技巧:让你的Windows媒体播放体验提升200%的Screenbox完全指南
  • 文墨共鸣大模型一键部署教程:基于Python的快速环境搭建指南
  • driftnet使用教程
  • 永磁同步电机PMSM无位置传感器控制:参数辨识,可以在线辨识电阻和转速的变化 Matlab/s...
  • 关于:STM32 KEIL5 中 __initial_sp初值的探索
  • 告别‘喜怒哀乐’:聊聊MER2024开放式情感识别赛道如何用LLM解锁更细腻的情绪表达
  • 用顺序表实现栈的基本操作