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

鸿蒙进阶篇-定时器、递归

“在科技的浪潮中,鸿蒙操作系统宛如一颗璀璨的新星,引领着创新的方向。作为鸿蒙开天组,今天我们将一同踏上鸿蒙基础的探索之旅,为您揭开这一神奇系统的神秘面纱。”

各位小伙伴们我们又见面了,我就是鸿蒙开天组,下面让我们进入今天的学习,鸿蒙进阶篇-定时器、递归

在鸿蒙开发中:

定时器:鸿蒙提供了相关的 API 来创建和使用定时器,用于实现定时触发任务、更新界面元素或执行其他周期性的操作。定时器可以帮助开发者实现一些与时间相关的功能逻辑,确保在特定的时间间隔后执行相应的代码块。

递归:和其他编程语言中的概念类似,在鸿蒙开发中,如果一个函数直接或间接地调用自身来解决问题,就形成了递归。例如在处理某些具有递归性质的数据结构(如树形结构)或者解决一些可以通过递归方式更简洁地表达的算法问题时,可能会用到递归。但需要注意递归可能会导致栈溢出等问题,所以在使用时要确保有合适的终止条件。

定时器
日常开发中如果需要代码 延迟一会执行,或者每隔一段时间执行一次,就可以使用定时器
定时器有两种:
1 setTimeout: 延迟执行
2 setInterval: 间隔执行

setTimeout


setTimeout可以用来设置一个定时器,当设置的时间到了之后就会去执行指定的函数
执行一次用 setTimeout
附上官方文档链接icon-default.png?t=O83Ahttps://developer.mozilla.org/zh-CN/docs/Web/API/setTimeout
setTimeout、clearTimeout是一个全局函数,可以直接使用

下面展示一个案例来理解:
@Entry
@Component
struct TimeoutDemo {
  // 只是用来保存数据,不影响 UI 可以不加状态修饰符
  timeId?: number
  @State word: number = 0

  build() {
    Column({ space: 20 }) {
      Text('延时器-Timeout')
        .fontSize(30)
        .width('100%')
        .textAlign(TextAlign.Center)
      Row({ space: 20 }) {
        Button('开启延时器')
          .onClick(() => {
            // 开启延时器
            let timeId = setTimeout(() => {
              this.word++
            }, 200)

            //  保存定时器 id
            this.timeId = timeId
          })
        Button('关闭延时器')
          .onClick(() => {
            // 调用 clearTimeout 清除定时器
            clearTimeout(this.word)
          })
        Text(this.word.toString())
      }
    }
    .padding(10)
  }
}

setInterval


setInterval 也是可以用来设置一个定时器,根据设置的时间间隔来执行指定的函数
执行多次用 setInterval!!
附上官方文档链接icon-default.png?t=O83Ahttps://developer.mozilla.org/zh-CN/docs/Web/API/setInterval
setInterval、clearInterval是一个全局函数,可以直接使用

下面展示一个案例来理解:

@Entry
@Component
struct Page02_interval {
  // 只是用来保存数据,不影响 UI 可以不加状态修饰符
  timeId?: number
  @State word: number = 0

  build() {
    Column({ space: 20 }) {
      Text('定时器-Interval')
        .fontSize(30)
        .width('100%')
        .textAlign(TextAlign.Center)
      Row({ space: 20 }) {
        Button('开启延时器')
          .onClick(() => {
            this.timeId = setInterval(() => {
              this.word++
            }, 2000)
          })
        Button('关闭延时器')
          .onClick(() => {
            clearInterval(this.timeId)
          })
      }

      Text(this.word.toString())
    }
    .padding(10)
  }
}

案例-获取验证码
接下来通过刚刚学习的定时器,来完成一个获取验证码的倒计时功能

下面展示一个案例来理解:

@Entry
@Component
struct LoginDemo {
  @State time: number = 0

  build() {
    Column() {
      this.titleBuilder()
      TextInput({ placeholder: '请输入手机号' })
        .textInputExtend()
      Divider()
      Row() {
        TextInput({ placeholder: '请输入验证码' })
          .textInputExtend()
          .layoutWeight(1)
        Text(this.time == 0 ? '发送验证码' : `${this.time}秒后获取`)
          .fontSize(14)
          .fontColor(Color.Gray)
          .onClick(() => {
            // 避免倒计时 为 0 时,重复点击
            if (this.time != 0) {
              return
            }
            setTimeout(() => {
              AlertDialog.show({
                message: Math.floor(1000 + 9000 * Math.random())
                  .toString()
              })
            }, 2000)
            this.time = 60
            const timeId = setInterval(() => {
              this.time--
              // 倒计时结束,清空定时器
              if (this.time == 0) {
                clearInterval(timeId)
              }
            }, 1000)
          })
      }
      .width('100%')

      Divider()

      Button('登录')
        .width('100%')
        .type(ButtonType.Normal)
        .backgroundColor('#ea6051')
        .margin({ top: 50 })

    }
    .padding({ top: 80, left: 40, right: 40 })
    .width('100%')
    .alignItems(HorizontalAlign.Start)
  }

  @Builder
  titleBuilder() {
    Text('短信登录')
      .fontSize(25)
      .fontWeight(600)
      .margin({ bottom: 30 })
  }
}

@Extend(TextInput)
function textInputExtend() {
  .backgroundColor(Color.White)
  .padding({ left: 0, top: 20, bottom: 20 })
  .placeholderColor('#ccc')
}

递归
调用自身的函数我们称之为递归函数。
附上官方文档链接icon-default.png?t=O83Ahttps://developer.mozilla.org/zh-CN/docs/Glossary/Recursion

基本用法
在某种意义上说,递归近似于循环。两者都重复执行相同的代码,并且两者都需要一个终止条件(避免无限循环,或者在这种情况下更确切地说是无限递归)。

// 没有退出条件的 递归函数--无限递归 function func(){ func() }

下面展示一个案例来理解:

let num: number = 1

function printLog(num: number) {
  console.log(`你好,第${num}次打印`)
  // 递减
  num--
  // 退出条件
  if (num > 1) {
    printLog(num)
  }
}

// 打印 10 次
printLog(10)

@Entry
@Component
struct Example01 {
  build() {
    Column() {
      Column() {
        Column() {
        }
        .margin(10)

      }.width(250)
      .height(500)
      .backgroundColor('#eee')
      .border({ width: 2, color: 'green', style: BorderStyle.Solid })

    }.width('100%')
  }
}

以上是关于鸿蒙进阶篇-定时器、递归 综合的一些内容,方便大家学习,至此,关于鸿蒙进阶篇-定时器、递归 综合的内容就介绍到这里,愿您能学以致用,开发出精彩的鸿蒙应用!

以上内容仅供学习交流,如有违法或者侵权可以联系删除。


http://www.kler.cn/a/397181.html

相关文章:

  • 【PIP】完整指南:Python `pip install` 和 `pip uninstall` 命令详解与清理技巧
  • Docker和VMWare有什么不同
  • react 中 useCallback Hook 作用
  • C++ | Leetcode C++题解之第560题和为K的子数组
  • opencv kdtree pcl kdtree 效率对比
  • 浅层神经网络
  • IDEA2024:右下角显示内存
  • .NET6.0 CS0579“System.Reflection.AssemblyCompanyAttribute”特性重复 问题解决
  • 计算机网络各层设备总结归纳(更新ing)
  • RAG经验论文《FACTS About Building Retrieval Augmented Generation-based Chatbots》笔记
  • Java项目实战II基于微信小程序的电子商城购物平台(开发文档+数据库+源码)
  • Spring Boot之Spring-devtools热部署
  • QQ 小程序已发布,但无法被搜索的解决方案
  • 【Linux:epoll】
  • Wireshark 分析SQL 批量插入慢的问题
  • 江苏显卡服务器有哪些好处?
  • 3D Gaussian Splatting 代码层理解之Part1
  • 【NodeJS】Node.js是什么?能做什么?
  • 基于微信小程序的平安驾校预约平台的设计与实现(源码+LW++远程调试+代码讲解等)
  • layui 输入框带清空图标、分词搜索、关键词高亮
  • DevExpress WinForms中文教程:Data Grid - 如何绑定到实体框架数据源?
  • 单词 Watch 讲解
  • ES-针对某个字段去重后-获取某个字段值的所有值
  • influxDB 时序数据库安装 flux语法 restful接口 nodjsAPI
  • 怎么样去挑选适合的CMS建站系统?
  • AI写作(十)发展趋势与展望(10/10)