鸿蒙UI布局实战—登录案例—获取验证码

417 阅读4分钟

前置准备-学习定时器 setTimeout 和 setInterval

一、定时器概念

日常开发中如果需要代码延迟一会执行,或者每隔一段时间执行一次,就可以使用定时器。

定时器有两种:

  1. setTimeout: 延迟执行-延时器
  2. setInterval: 间隔执行-定时器

1.1 setTimeout 可以用来设置一个延时器,当设置的时间到了之后就会去执行指定的函数(执行次数:1次)

setTimeout与clearTimeout绑定使用,clearTimeout作用:清除已加载的延时器(当开启延时器后,延时器将会返回自身的id,clearTimeout拿到延时器的id可将setTimeout在未执行逻辑前将其(setTimeout)清除)。

setTimeout、clearTimeout是一个全局函数,可以直接使用。

// 1. 基本使用
setTimeout(()=>{
  // 延时执行的逻辑
},时间)

// 2. 获取返回的延时器 id
const timeId = setTimeout(()=>{
  // 延迟执行的逻辑
},时间)

// 3. 根据定时器 id 清除延时器
clearTinmeout(timeId)

下面我们用两个按钮来了解延时器的工作流程

使用步骤

  1. 延迟执行逻辑
  2. 获取返回的 延时器 id
  3. 通过延时器 id清除已开启的延时器
timeId?: number//定义一个变量来获取定时器的id

Button('开启延时器')
          .onClick(() => {
            // 开启延时器
            let timeId = setTimeout(() => {
              // 延迟执行逻辑
              console.log('代码执行啦')
            }, 2000)

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

1.2 setInterval 也是可以用来设置一个定时器,根据设置的时间间隔来执行指定的函数(执行次数:无限次,根据设定的时间间隔重复执行)

setInterval、clearInterval绑定使用,clearInterval的作用:清除已加载的定时器

setInterval、clearInterval是一个全局函数,可以直接使用

// 1. 基本使用
setInterval(()=>{
  // 延迟执行的逻辑
},时间)

// 2. 获取返回的定时器 id
const timeId = setInterval(()=>{
  // 延迟执行的逻辑
},时间)

// 3. 根据定时器 id 清除定时器
clearInterval(timeId)

下面我们用两个按钮来了解定时器的工作流程

  1. 间隔执行逻辑
  2. 获取返回的 定时器 id
  3. 通过定时器 id 清除已开启的定时器
timeId?: number//定义一个变量来获取定时器id

Button('开启延时器')
          .onClick(() => {
            this.timeId = setInterval(() => {
              console.log('代码执行啦~')
            }, 2000)
          })
        Button('关闭延时器')
          .onClick(() => {
            clearInterval(this.timeId)
          })

二、获取验证码案例

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

需求:
1. 获取验证码
  a. 点击按钮之后,延迟 2 秒(setTimeoutb. 获取一个 4 位的随机数,通过弹框显示出来(AlertDialog.show({message:}))
  c. 获取随机数方法,Math.floor(1000+Math.random()*9000)
2. 倒计时效果
  a. 点击开启倒计时
    ⅰ. @State time = 0
      1. 点了之后->60
    ⅱ. setInterval
      1. time--
      2. time==0 关闭定时器
  b. 切换显示效果
    ⅰ. 默认:发送验证码
    ⅱ. 倒计时中:xx 秒后获取
    ⅲ. 根据 time 是否为 0 来决定
      1. 0:发送验证码
      2. 不为 0xx 秒后获取
  c. 倒计时中无法重复点击
    ⅰ. 时间为 0 时:可以点击
    ⅱ. 时间不为 0 时:不可以点击
@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
            }
            this.time = 60 //注意:测试时修改这里的number可以避免等待较长时间
            const timeId = setInterval(() => {
              this.time--
              // 倒计时结束,清空定时器
              if (this.time == 0) {
                clearInterval(timeId)
              }
            }, 1000)
            //定时器清除后通过setTimeout延时两秒执行随机数
            setTimeout(() => {
              AlertDialog.show({ //通过UI弹窗的方式将4位随机数显示
                message: Math.floor(1000 + 9000 * Math.random())
                  .toString()
              })
            }, 2000)
          })
      }
      .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')
}

image.png

以上就是所有内容啦,后续会继续拓展(登录前的验证)