开启鸿蒙开发之旅:交互——点击事件

前一节我们写好了"提醒事项"APP首页的静态页面,光有静态页面肯定是不够的,更重要的是交互,今天这一节我将来学习最常用的交互事件------点击事件。

点击事件

说明:组件被点击时触发的事件

作用:监听(感知)用户点击行为,进行对应操作

在添加按钮上增加点击事件,点击后弹出添加弹窗。

实现步骤


1、设置动态变量model_zIndex

设置动态zIndex来动态控制弹窗的zIndex的层级,当需要显示时,将层级调高,隐藏时层级调低。

javascript 复制代码
@State model_zIndex:number = -1

2、给弹窗绑定动态zIndex

javascript 复制代码
Coloum(){
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.End)
.backgroundColor('#cd000000')
.zIndex(this.model_zIndex)

3、给元素绑定点击事件

在鸿蒙OS Next中,绑定点击事件直接在元素上.onClick,在点击事件中动态改变model_zIndex 的值:

javascript 复制代码
 Image($r('app.media.ic_add'))
          .width(20)
          .fillColor('#007AFF')
          .margin({
            right: 10
          })
          .onClick(() => {
            this.model_zIndex = 99
          })

4、隐藏弹窗

在"取消"按钮上绑定点击事件,并在点击事件中修改 model_zIndex的值:

javascript 复制代码
 Text('取消')
   .fontSize(18)
   .fontColor('#007AFF')
   .onClick(() => {
    this.model_zIndex = -1
     })

完整代码


index.ets文件的完整代码如下:

javascript 复制代码
interface card {
  icon: string
  num: number
  bgColor: string
  iconNum: boolean,
  title: string
}

interface list {
  icon: string
  bgColor: string
  title: string
  num: number
}
console.log('2222')
@Entry
@Component
struct Index {
  @State cardData: card[] = [
    {
      icon: 'app.media.ic_date',
      num: 4,
      bgColor: '#007AFF',
      iconNum: true,
      title: '今天'
    },
    {
      icon: 'app.media.ic_date2',
      num: 4,
      bgColor: '#ff3a2f',
      iconNum: false,
      title: '计划'
    },
    {
      icon: 'app.media.ic_box',
      num: 6,
      bgColor: '#000',
      iconNum: false,
      title: '全部'
    },
    {
      icon: 'app.media.ic_qizi',
      num: 0,
      bgColor: '#ff9501',
      iconNum: false,
      title: '旗标'
    },
    {
      icon: 'app.media.ic_ok',
      num: 0,
      bgColor: '#596772',
      iconNum: false,
      title: '完成'
    }
  ]

  @State listData:list[] = [
    {
    icon: 'app.media.ic_list',
    bgColor:'#007AFF',
    title:'提醒事项',
    num:6
  },
    {
      icon: 'app.media.ic_list',
      bgColor:'#ff9501',
      title:'提醒',
      num:0
    }
  ]

  @State model_zIndex:number = -1
  @State addButtonColor:string = '#ccc'
  build() {

    Stack() {
      Column() {
        Row() {
          Image($r('app.media.ic_search'))
            .width(30)
            .fillColor(Color.Gray)
          TextInput({ placeholder: '搜索' })
            .layoutWeight(1)
            .backgroundColor(Color.Transparent)
          Image($r('app.media.ic_voice'))
            .width(30)
            .fillColor(Color.Gray)
        }
        .width('100%')
        .height(50)
        .backgroundColor('#e4e3e9')
        .borderRadius(15)
        .padding({
          left: 10,
          right: 10
        })

        Flex({ wrap: FlexWrap.Wrap, justifyContent: FlexAlign.SpaceBetween }) {
          ForEach(this.cardData, (item: card, index) => {
            Row() {
              Column({ space: FlexAlign.SpaceBetween }) {
                Stack() {
                  Row() {
                    Image($r(item.icon))
                      .width(index == 2 ? 20 : 30)
                  }
                  .width(40)
                  .height(40)
                  .borderRadius(40)
                  .backgroundColor(item.bgColor)
                  .justifyContent(FlexAlign.Center)

                  if (item.iconNum) {
                    Text('12')
                      .fontColor(Color.White)
                      .fontSize(12)
                      .margin({
                        right: 3,
                        top: 5
                      })
                  }

                }

                Text(item.title)
                  .fontColor(Color.Gray)
                  .fontSize(18)
              }
              .height('100%')

              Blank()
              Text(String(item.num))
                .fontSize(30)
                .fontWeight(FontWeight.Bold)
            }
            .width('48%')
            .height(90)
            .backgroundColor('#e4e3e9')
            .borderRadius(15)
            .padding(10)
            .alignItems(VerticalAlign.Top)
            .margin({
              bottom: 10
            })
          })


        }
        .margin({
          top: 10
        })

        Text('我的列表')
          .fontSize(20)
          .fontWeight(FontWeight.Bold)
          .alignSelf(ItemAlign.Start)
          .margin({
            left: 10,
            bottom: 10
          })
        List() {
          ForEach(this.listData,(item:list,index) => {
            ListItem() {
              Row() {
                Row() {
                  Image($r(item.icon))
                    .width(20)
                    .fillColor(Color.White)
                }
                .width(30)
                .height(30)
                .borderRadius(30)
                .backgroundColor(item.bgColor)
                .justifyContent(FlexAlign.Center)
                .margin({
                  right: 10
                })

                Text(item.title)
                Blank()
                Text(String(item.num))
                Image($r('app.media.ic_right')).width(20)
                Text('')
                  .width('90%')
                  .height(0.5)
                  .backgroundColor('#ccc')
                  .position({
                    bottom: -10,
                    right: -10
                  })

              }

              .width('100%')
              .justifyContent(FlexAlign.SpaceBetween)

            }
            .height(50)
            .width('100%')
            .padding({
              left: 10,
              right: 10
            })
          })



        }
        .backgroundColor(Color.White)
        .borderRadius(10)

      }
      .width('100%')
      .height('100%')
      .padding(15)
      .backgroundColor('#fff2f8')

      Row() {
        Image($r('app.media.ic_add'))
          .width(20)
          .fillColor('#007AFF')
          .margin({
            right: 10
          })
          .onClick(() => {
            this.model_zIndex = 99
          })
        Text('添加提醒事项')
          .fontColor('#007AFF')
        Blank()
        Text('添加列表')
          .fontColor('#007AFF')
      }
      .width('100%')
      .padding(15)

      Column(){
        Column(){
          Row() {
            Text('取消')
              .fontSize(18)
              .fontColor('#007AFF')
              .onClick(() => {
                this.model_zIndex = -1
              })
            Text('新提醒事项')
              .fontSize(20)
              .fontWeight(FontWeight.Bold)
            Text('添加')
              .fontSize(18)
              .fontColor(this.addButtonColor)
          }
          .width('100%')
          .justifyContent(FlexAlign.SpaceBetween)
          Column() {
            TextInput({placeholder:'标题'})
              .backgroundColor('#fff')
              .borderRadius(0)
            Text('')
              .width('95%')
              .height(0.5)
              .backgroundColor('#ccc')
              .alignSelf(ItemAlign.End)
            TextInput({placeholder:'备注'})
              .backgroundColor('#fff')
          }
          .width('100%')
          .height(180)
          .backgroundColor('#fff')
          .padding({
            top:5
          })
          .borderRadius(10)
          .margin({
            top:20
          })

          Row(){
            Text('详细信息')
            Blank()
            Image($r('app.media.ic_right'))
              .width(20)
          }
          .width('100%')
          .height(50)
          .backgroundColor('#fff')
          .margin({
            top:20
          })
          .padding(10)
          .borderRadius(6)

          Row() {
            Row(){
              Image($r('app.media.ic_list'))
                .width(20)
                .fillColor('#fff')
            }
            .width(30)
            .height(30)
            .borderRadius(30)
            .backgroundColor('#007AFF')
            .justifyContent(FlexAlign.Center)
            .margin({
              right:10
            })

            Text('列表')
            Blank()
            Text('提醒事项')
            Image($r('app.media.ic_right'))
              .width(20)
          }
          .width('100%')
          .height(50)
          .backgroundColor('#fff')
          .margin({
            top:20
          })
          .padding(10)
          .borderRadius(6)
        }
        .width('100%')
        .height('95%')
        .backgroundColor('#fff2f8')
        .padding(10)


      }
      .width('100%')
      .height('100%')
      .justifyContent(FlexAlign.End)
      .backgroundColor('#cd000000')
      .zIndex(this.model_zIndex)
    }
    .alignContent(Alignment.Bottom)

  }
}
相关推荐
程序员shen16161115 分钟前
抖音短视频saas矩阵源码系统开发所需掌握的技术
java·前端·数据库·python·算法
Ling_suu43 分钟前
SpringBoot3——Web开发
java·服务器·前端
Yvemil71 小时前
《开启微服务之旅:Spring Boot Web开发》(二)
前端·spring boot·微服务
hanglove_lucky1 小时前
本地摄像头视频流在html中打开
前端·后端·html
维李设论1 小时前
Node.js的Web服务在Nacos中的实践
前端·spring cloud·微服务·eureka·nacos·node.js·express
2401_857600951 小时前
基于 SSM 框架 Vue 电脑测评系统:赋能电脑品质鉴定
前端·javascript·vue.js
天之涯上上1 小时前
Pinia 是一个专为 Vue.js 3 设计的状态管理库
前端·javascript·vue.js
@大迁世界1 小时前
摆脱 `<div>`!7 种更语义化的 HTML 标签替代方案
前端·html
高山我梦口香糖2 小时前
[react] <NavLink>自带激活属性
前端·javascript·react.js
撸码到无法自拔2 小时前
React:组件、状态与事件处理的完整指南
前端·javascript·react.js·前端框架·ecmascript