【04】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-ArkTs进阶运算符+状态管理(附综合案例美团购物车)

序言:

本文详细介绍了字符串拼接、各类运算符、状态管理(界面数据动态展示)并给出相应的具体案例和实现代码。

笔者也是跟着B站黑马的课程一步步学习,学习的过程中添加部分自己的想法整理为笔记分享出来,如有代码错误或笔误,欢迎指正。

B站黑马的课程链接:鸿蒙课程介绍_哔哩哔哩_bilibili

往期笔记:

【01】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-ArkTs基础语法与界面开发基础

【02】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-界面进阶与布局排布(附QQ登陆、得物、京东登陆综合案例+代码)

【03】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-更多布局(弹性/层叠)方式与界面开发综合(附飞狗卡片+B站卡片案例+实战开发支付宝界面+代码)

目录

一.字符串拼接

二.类型转换

三.交互-点击事件

四.状态管理

五.运算符

六.综合案例-美团购物车


一.字符串拼接

作用:把两个或多个字符串,拼接成一个字符串(通常拼字符串和变量)

代码例子:

//字符串拼接
let name:string = '河马'
let age:number = 18
console.log('简介信息','姓名'+name)
console.log('简介信息','年龄'+age)
//tip:+两边只要有字符串,'+'都是拼串的作用(如果两边都是数字,则为计算的作用)

控制台日志:

二.类型转换

1.字符串转数字

Number()
//字符串直接转数字,转换失败返回NaN(字符串中包含非数字)
parseInt()
//去掉小数部分 转数字,转换失败返回NaN
parseFloat()
//保留小数部分 转数字,转换失败返回NaN

2.数字转字符串

toString()
//数字直接转字符串
toFixed()
//四舍五入转字符串,可以设置保留几位小数

代码例子:

let money1:string = '12000'
let money2:number = 5000
console.log('总工资',Number(money1)+money2)
//字符串通常用于展示
@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  build() {
    Column(){
      Text(money2.toString())
    }
  }
}

三.交互-点击事件

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

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

语法:

onClick((参数)=>{})

代码案例:

  build() {
    Column(){
      Button('点点我')
        .onClick(()=>{
          console.log('敢点击我,你比泰森还牛逼')
        })
        .width('100%')
    }
  }

控制台日志:

代码案例2(+弹框)

  build() {
    Column(){
      Button('点点我')
        .onClick(()=>{
          AlertDialog.show({
            message:'敢点我,你比泰森还牛逼!'
          })
        })
        .width('100%')
    }
  }

代码案例3:

      Text('我是文本组件')
        .width('100%')
        .backgroundColor(Color.Pink)
        .onClick(()=>{
          AlertDialog.show({
            message:'其实我是一个神秘的杀手'
          })
        })

四.状态管理

之前构建的页面多为静态界面。

但如果希望构建一个动态的、有交互的界面,就需要引入“状态”的概念

点击交互 触发了 文本状态变更,状态变更引起了UI渲染

普通变量:只能在初始化时渲染,后续不会再刷新

状态变量:需要装饰器装饰,改变会引起UI的渲染刷新(必须设置类型和初始值)

组建内的状态变量需要用this.xxx来引入

  build() {
    Column(){
      Text(this.msg2)
        .fontSize(50)
        .width('100%')
        .margin({bottom:30})
      Button('点击修改文字')
        .onClick(()=>{
          this.msg2='我是超绝无敌派大星'
        })

    }
    .margin(50)
  }

计数器案例

Row(){
      Button('-')
        .onClick(()=>{
          this.num--
        })
      Text(this.num.toString())
        .margin(10)
      Button('+')
        .onClick(()=>{
          this.num++
        })
    }

五.运算符

1.算术运算符&赋值运算符

算数运算符

作用

赋值运算符

作用

+

加法运算

+=

加法赋值

-

减法运算

-=

减法赋值

*

乘法运算

*=

乘法赋值

/

除法运算

/=

除法赋值

%

取余(求模)

%=

取余赋值

例:num+=1 相当于num=num+1

2.案例-点赞案例

build() {
    Column(){
      //图片
        Image($r('app.media.eyes'))
          .width('100%')
          .borderRadius({topLeft:10,topRight:10})
      //文字
      Text('考眼力又来了你能看见几只鸭子?')
        .fontSize(30)
        .padding(5)


      Row() {
        Image($r('app.media.avatar'))
          .width(50)
          .padding(5)
        Text('视野联行眼镜')
          .fontSize(20)
          .margin(10)
          .fontColor('#ccc')
        Blank()
        Row() {
          Image($r('app.media.ic_love'))
            .width(14)
            .fillColor(this.mycolor)
          Text(this.num.toString())
            .padding(5)
            .fontSize(12)
            .fontColor(this.mycolor)
            .onClick(() => {
              this.num++
            })
        }
        .onClick(()=>{
          this.num=this.num+1
          this.mycolor='#ff0000'
        })
      }
      .width('100%')
    }
    .width('100%')
  }

→点击小爱心或文字

3.一元运算符

常见一元运算符:++和--

前置写法:先赋值后自增/自减

let num1:number = 10
let num2:number = ++num1 //num2=11

后置写法:后赋值后自增/自减

let num1:number = 10
let num2:number = num1-- //num2=9

4.比较运算符

作用:用来判断比较两个数据大小,返回一个布尔值(true/false)

类型:<、>、 >=、<=、==、!=

例子:

5.逻辑运算符

作用:扩充判断条件

逻辑运算符

作用

&&

与,都真才真

||

或,一真就真

非,取反

代码示例:

6.运算符优先级

六.综合案例-美团购物车

1.需求分析:

①商品区域:数字框 + -

②底部结算:联动计算并渲染展示(已选件数 总价格 优惠价格)

2.核心思路:

①提取状态:数量、原价、现价

②界面绑定

③点击修改数据,自动更新

代码:

struct Index {
  // 核心思路:
  // 1. 提取状态: 数量, 原价, 现价
  // 2. 结合状态渲染
  // 3. 修改状态, 界面自动更新
  @State count: number = 5
  @State oldPrice: number = 40.4
  @State newPrice: number = 10.4
  build() {
    Column() {
      Column() {
        // 产品
        Row({ space: 10}){
          // 图片
          Image($r('app.media.product1'))
            .width(100)
            .borderRadius(8)
          // 文字
          Column({space: 10}) {
            Column({ space: 6}) {
              Text('冲销量1000ml缤纷八果水果捞')
                .lineHeight(20)
                .fontSize(14)
              Text('含1份折扣商品')
                .fontSize(12)
                .fontColor('#7f7f7f')
            }
            .width('100%')
            .alignItems(HorizontalAlign.Start)
            Row(){
              // 价格
              Row({ space: 5}) {
                Text() {
                  Span('¥')
                    .fontSize(14)
                  Span(this.newPrice.toFixed(2))
                    .fontSize(18)
                }
                .fontColor('#ff4000')
                Text() {
                  Span('¥')
                  Span(this.oldPrice.toFixed(2))
                }
                .fontSize(14)
                .fontColor('#999')
                .decoration({type: TextDecorationType.LineThrough, color: '#999'})
              }
              // 加减
              Row() {
                Text('-')
                  .width(22)
                  .height(22)
                  .border({width:1, color: '#e1e1e1', radius: {topLeft: 5, bottomLeft: 5}})
                  .textAlign(TextAlign.Center)
                  .fontWeight(700)
                  .onClick(() => {
                    // this.count = this.count - 1
                    // 让状态变量,在原有数据的基础上自减1
                    this.count--
                  })
                Text(this.count.toString())
                  .height(22)
                  .border({width: { top:1, bottom: 1 }, color: '#e1e1e1'})
                  .padding({left: 10, right: 10})
                  .fontSize(14)
                Text('+')
                  .width(22)
                  .height(22)
                  .border({width:1, color: '#e1e1e1', radius: {topRight: 5, bottomRight: 5}})
                  .textAlign(TextAlign.Center)
                  .fontWeight(700)
                  .onClick(() => {
                    this.count++
                  })
              }
            }
            .width('100%')
            .justifyContent(FlexAlign.SpaceBetween)
          }
          .height(75)
          .layoutWeight(1)
          .justifyContent(FlexAlign.SpaceBetween)
        }
        .width('100%')
        .alignItems(VerticalAlign.Top)
        .padding(20)


        // 结算
        Row({ space: 10 }){
          // 价格
          Column({space: 5}) {
            Text() {
              Span(`已选 ${this.count} 件,`)
                .fontColor('#848484')
              Span('合计:')
              Span('¥')
                .fontColor('#fd4104')
              Span((this.count * this.newPrice).toFixed(2))
                .fontColor('#fd4104')
                .fontSize(16)
            }
            .fontSize(14)
            Text('共减¥' + (this.count * (this.oldPrice - this.newPrice)).toFixed(2))
              .fontColor('#fd4104')
              .fontSize(12)
          }
          .alignItems(HorizontalAlign.End)
          // 结算按钮
          Button('结算外卖')
            .width(110)
            .height(40)
            .backgroundColor('#fed70e')
            .fontColor('#564200')
            .fontSize(16)
            .fontWeight(600)
        }
        .width('100%')
        .height(70)
        .backgroundColor('#fff')
        .position({x:0, y: '100%'})
        .translate({y: '-100%'})
        .padding({ left: 20, right: 20 })
        .justifyContent(FlexAlign.End)
      }
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#f3f3f3')
  }
}

感谢观看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值