news 2026/7/31 14:31:48

鸿蒙掌上驾考宝典应用开发15:答题交互组件——Exam 与 SelectComponent 全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
鸿蒙掌上驾考宝典应用开发15:答题交互组件——Exam 与 SelectComponent 全解析

第15篇:答题交互组件——Exam 与 SelectComponent 全解析

一、引言

答题交互是驾考应用最核心的用户交互场景。DriverLicenseExam 项目的Exam组件和SelectComponent组件共同实现了完整的答题交互体验,包括试题展示、选项选择、答案判断、答题卡、倒计时等。本文将深入解析这两个组件的实现。

二、Exam 组件架构

2.1 组件职责

Exam 组件是考试页面的核心容器,负责:

  • 管理试题列表(Swiper 滑动切换)
  • 展示倒计时(模拟考试)
  • 管理答题卡浮层
  • 处理模拟考试结束弹窗

2.2 组件接口

// components/exam/src/main/ets/components/Exam.ets@Entry@ComponentV2 export struct Exam {@Param@RequireappPathStack: NavPathStack;// 路由栈@Param@RequireexamManager: ExamManager;// 试卷数据@ParammockExamCall: (score: number) => void = (score: number) => {};// 模拟考试回调private examController: ExamController = ExamController.instance;@LocalremainTime: number =0;// 剩余时间@LocalisShowProblemListSheet: boolean = false;// 答题卡显示@LocalcurrentIndex: number =0;// 当前第几题@LocalisStop: boolean = false;// 暂停状态private readonly renderWindowSize: number =2;// 渲染窗口大小}

三、答题交互流程

3.1 试题渲染

build(){Column(){// 模拟考试倒计时this.showRemainTime();// 试题列表(Swiper 滑动切换)Swiper(examController.swiperController){ForEach(this.examManager.examDetails, (item: ExamDetail,examIndex:number)=> {Column({space: 12 }){if(this.shouldRenderQuestion(examIndex)) { SelectComponent({item: item,changeCorrectNum: (isAdd: boolean) => {isAdd ? this.examManager.correctNumber++: this.examManager.correctNumber--;},}); } } }); } // ... 底部导航(答题卡、上一题、下一题) } }

3.2 渲染窗口优化

// 只渲染当前题附近的题目,提高大题库性能privatereadonlyrenderWindowSize:number=2;shouldRenderQuestion(examIndex:number):boolean{returnMath.abs(examIndex -this.currentIndex) <=this.renderWindowSize; }

四、模拟考试倒计时

4.1 倒计时实现

aboutToAppear(): void {this.currentIndex =this.examManager.currentQuestionId +1;if(this.examManager.timeLimit !==0) {this.remainTime =this.examManager.timeLimit *60; let showDialog: boolean =true; setInterval(() => {if(showDialog && !this.isStop) {if(this.remainTime >=1) {this.remainTime--; }else{ showDialog =false;this.isStop =true;this.examSubmitDialog.open(); } } },1000); } }

4.2 时间格式化

@BuildershowRemainTime() {if(this.examManager.timeLimit!==0) {Row() {Image($r('app.media.ic_time')).width(16).height(16);Text(`${Math.floor(this.remainTime /60)}:${String(this.remainTime %60).padStart(2,'0')}`) .fontSize(14) .fontColor('#FF6B6B'); } } }

五、答题卡实现

5.1 答题卡数据

// 生成答题卡数据getanswerCardData() {returnthis.examManager.examDetails.map((item, index) =>({index: index +1,status: item.isCorrect===undefined?'unanswered': item.isCorrect?'correct':'wrong',isCurrent: index ===this.currentIndex})); }

5.2 答题卡交互

// 底部打开答题卡浮层Button('答题卡') .onClick(() => {this.isShowProblemListSheet =true; }) .bindSheet($$this.isShowProblemListSheet,this.answerCardSheet(), { height:400, title: { title:'答题卡'}, });

六、总结

Exam 和 SelectComponent 组件的设计体现了 ArkUI 组件化的最佳实践:

  1. 职责分离:Exam 管理流程,SelectComponent 管理交互
  2. 性能优化:渲染窗口机制减少不必要的渲染
  3. 状态管理:@Local 管理内部状态,@Param 接收外部数据
  4. 用户体验:倒计时、答题卡、弹窗等交互细节

关键源码文件:

  • components/exam/src/main/ets/components/Exam.ets— 考试主组件
  • components/exam/src/main/ets/components/SelectComponent.ets— 选择组件
  • components/exam/src/main/ets/controller/ExamController.ets— 考试控制器
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/31 14:28:12

如何正确使用SetThreadExecutionState来阻止Windows进入睡眠

如何正确使用SetThreadExecutionState来阻止Windows进入睡眠 引言&#xff1a;为什么需要阻止Windows进入睡眠&#xff1f;在开发需要长时间运行的应用程序时&#xff0c;比如视频播放器、下载工具、远程桌面客户端或监控软件&#xff0c;我们常常会遇到一个问题&#xff1a;当…

作者头像 李华
网站建设 2026/7/31 14:25:15

烧录效率优化①:产线瓶颈到底卡在哪?

前言新品导入阶段&#xff0c;产线排产表已经定稿&#xff0c;UPH&#xff08;每小时产出&#xff09;指标写进了周报&#xff0c;但烧录站的实际吞吐量始终卡在预期值的六到七成。加开烧录座、换更贵的烧录器、给操作员加班——这些动作做了一圈&#xff0c;产能曲线依然没有起…

作者头像 李华
网站建设 2026/7/31 14:22:22

STM32高级定时器互补PWM配置全解析:从死区时间到电机驱动实战

1. 项目概述&#xff1a;为什么需要高级定时器的互补PWM&#xff1f; 在电机控制、电源转换这些对时序和可靠性要求极高的领域&#xff0c;单纯一路PWM信号往往不够用。比如驱动一个H桥电路来控制直流电机正反转&#xff0c;你需要控制上下桥臂的两路MOSFET或IGBT。这两路信号必…

作者头像 李华