鸿蒙开发-this指向+样式复用+代码调试

​🌈个人主页:前端青山
🔥系列专栏:鸿蒙开发篇
🔖人终将被年少不可得之物困其一生

依旧青山,本期给大家带来鸿蒙开发篇专栏内容:鸿蒙开发-this指向+样式复用+代码调试

目录

一、this指向

1.原生

鸿蒙

this使用细节 - 箭头函数

小总结

二、样式复用

1.@Styles

2.@Extend

3.多态

三、代码调试

预览+日志的方式debug

断点调试

1. 点击编辑配置

2. 选择对应的entry

3. 多模块调试支持

4. 点击应用后再点击确定完成配置

5. 开始调试

6. 相关功能键使用

一、this指向

1.原生

简单概括: 调用当前方法的对象 也就是谁调用的打印的就是谁

固定公式

普通函数   window
​
对象函数   对象本身
​
事件函数   事件源
​
定时器函数  window
​
箭头函数   父function中的this  父没有function就是window
​
自定义     call/apply/bind
​
构造函数   this === 实例化对象 === 公共空间/原型对象上方法中的this
<button>+1</button>
​
<script>
  const fn1 = function() {
    console.log('普通函数 window: ', this)
  }
  fn1()
​
  const obj1 = {
    a:1,
    b:2,
    c: function() {},
    d() {
      console.log('对象函数 对象本身:', this)
    }
  }
  obj1.d()
​
​
  document.querySelector('button').onclick = function() {
    console.log('事件函数:事件源', this)
  }
​
  setTimeout(function() { // TODO: 切记别写箭头  写了就是父级this指向 
    console.log('定时器函数 window: ', this)
  }, 0)
​
​
  class Animal {
    a = 1
    b = 2
​
    eat() {
      console.log('构造函数/类中的 自身', this)
    }
  }
​
  const dog = new Animal()  // {a:1,b:2}
  dog.eat()
</script>

鸿蒙

this 自身/组件实例

新建 页面 LearnThis

@Entry
@Component
struct LearnThis {
​
  // 需求:验证鸿蒙中的this是谁,首先第一点确保自己的项目不出问题
  // 明确1:鸿蒙声明响应式数据参考了js中es6中的class语法
  // 明确2:加 装饰器 @State 修饰符才有影响 ===》 @State 当前数据改变会同步到视图更新
​
  // 1.如何定义数据 组件的大括号内声明 ==》 装饰器 数据名:数据类型 = 数值
  // 2.如何获取数据 this.数据名
  // 3.如何修改数据 this.数据名 = 数值
​
  // 设置响应式数据 num
  @State num: number = 1
​
  aaa = 1111
  bbb = 222
  ccc = 333
  ddd = function () {}
​
  eee () {
    console.log('555', this)
    return '666'
  }
​
  build() {
    Column() {
      // Text组件内部要求参数必须为string|Resouce
      // 如何将number类型数据转化为string类型
      Text(String(this.num)) // 1
      Text(this.num + '') // 2
      Text(this.num.toString()) // 3
      Text(`${this.num}`) // 4
​
​
      Button('测试响应式效果')
        .onClick(() => {
          console.log('hello')
          this.num++
          console.log('数据', this.num)
        })
​
      Button('打印this')
        .onClick(() => {
          // 注意: 对象看不到具体数据,可以将其转化为字符串
          console.log('this1:', this)
          console.log('this2:', JSON.stringify(this))
          console.log('this3:', this.eee())
        })
​
      Button('访问this')
        .onClick(this.eee) // 555 undefined
    }
  }
}

this使用细节 - 箭头函数

@Entry
  @Component
  struct Index {
​
    // es6 类class语法    属性名 = 数据   只不过赋值是一个函数
    // onTest1 = () => {
    //
    // }
​
    // es6 类class语法   原型的写法
    // onTest2() {
    onTest2 = () => { // 父级环境中的this  因为父级是组件实例  
      console.log('hello', this)
    }
​
    build() {
      Column() {
        // 调用数据  this.状态名
        // 调用函数  this.函数名()    this.函数名
        // - 区别1:有小括号执行了
        // - 去背2:如果打印他们两   有小括号因为执行了所以打印的结果 没写return undefined、   没有小括号打印的是函数本身
        // Button('this调用函数的细节').onClick(() => {
        //     console.log('【不加】小括号调用:', this.onTest2)  // 函数本身
        //     console.log('【  加】小括号调用:', this.onTest2()) // 执行打印返回结果
        // })
​
        // Button('this调用函数的细节').onClick(this.onTest2())
        Button('this调用函数的细节').onClick(this.onTest2)  // 发现undefined
        // Button('this调用函数的细节').onClick(() => {
        //   this.onTest2()
        // })
      }
    }
  }

小总结

1、原生js 在各种场景的下的this指向

2、鸿蒙中的this =》 组件自身 (因为是组件自身所以可以使用组件中的状态或者方法)

3、this使用细节 (使用的不好会出现undefined情况)

二、样式复用

1.@Styles

如果每个组件的样式都需要单独设置,在开发过程中会出现大量代码在进行重复样式设置,虽然可以复制粘贴,但为了代码简洁性和后续方便维护,我们推出了可以提炼公共样式进行复用的装饰器@Styles。

@Styles装饰器可以将多条样式设置提炼成一个方法,直接在组件声明的位置调用。通过@Styles装饰器可以快速定义并复用自定义样式。用于快速定义并复用自定义样式

  • 局部定义

// 全局
@Styles function functionNameStyle() { 
  .width(150)
    .height(100)
    .backgroundColor(Color.Red)
}
​
@Entry
  @Component
  sturt Index {
    // 组件内
    @Styles functionNameStyle() { ... }
​
    build() {
      Text('Text')
        .functionNameStyle()
    }
  }
demo - 新建页面 LearnStyles

// 全局公共样式
@Styles function myIptStyle () {
  .height(60)
  .backgroundColor('#fff')
  .borderRadius(0)
  .border({
    width: { bottom: 2 },
    color: '#dadada'
  })
}
@Component
struct OtherCom { // 全局样式 在其他组件中也可以使用
  build() {}
}
​
@Entry
@Component
struct LearnStyles {
  // 局部公共样式
  @Styles iptStyle () {
    .height(60)
    .backgroundColor('#fff')
    .borderRadius(0)
    .border({
      width: { bottom: 2 },
      color: '#dadada'
    })
  }
​
  build() {
    Column() {
      TextInput({ placeholder: '手机号'})
        .height(60)
        .backgroundColor('#fff')
        .fontSize(26)
        .borderRadius(0)
        .border({
          width: { bottom: 2 },
          color: '#dadada'
        })
        .placeholderColor('#acacac')
        .placeholderFont({ size: 26 })
      TextInput({ placeholder: '密码'})
        .iptStyle() // 调用局部
        .placeholderColor('#acacac')
        .placeholderFont({ size: 26 })
        .fontSize(26)
      TextInput({ placeholder: '确认密码'})
        .myIptStyle() // 调用全局
        .placeholderColor('#acacac')
        .placeholderFont({ size: 26 })
        .fontSize(26)
        // .height(60)
        // .backgroundColor('#fff')
        // .borderRadius(0)
        // .border({
        //   width: { bottom: 2 },
        //   color: '#dadada'
        // })
    }
  }
}

2.@Extend

@Extend 用于扩展原生组件样式,通过传参提供更灵活的样式复用

  • 仅支持全局

  • 支持传参,传递状态自动同步,也可以传递回调函数

// 全局  原生组件                     参数
//  ↓     ↓                          ↓ 
@Extend(Text) function 属性名字(data: number) { 
  .width(data)
}
  • demo1 新建 页面 LearnExtend

@Extend(TextInput) function iptExtendStyle () {
  .height(60)
  .backgroundColor('#fff')
  .fontSize(26)
  .borderRadius(0)
  .border({
    width: { bottom: 2 },
    color: '#dadada'
  })
  .placeholderColor('#acacac')
  .placeholderFont({ size: 26 })
}
// cb: (data: string) => void
// cb 作为函数的参数
// (data: string) => void 代表的是cb参数的数据类型
// (data: string) => void 同时是一个函数,该函数没有返回值void,参数为data,data的数据类型为string
@Extend(TextInput) function iptExtendStyleCallback (cb: (data: string) => void) {
  .height(60)
  .backgroundColor('#fff')
  .fontSize(26)
  .borderRadius(0)
  .border({
    width: { bottom: 2 },
    color: '#dadada'
  })
  .placeholderColor('#acacac')
  .placeholderFont({ size: 26 })
  .onChange(cb)
}
​
@Entry
@Component
struct LearnExtend {
​
  build() {
    Column() {
      TextInput({ placeholder: '手机号'})
        .height(60)
        .backgroundColor('#fff')
        .fontSize(26)
        .borderRadius(0)
        .border({
          width: { bottom: 2 },
          color: '#dadada'
        })
        .placeholderColor('#acacac')
        .placeholderFont({ size: 26 })
        .onChange(val => {
          console.log('手机号:' + val)
        })
      TextInput({ placeholder: '密码'})
        .iptExtendStyle() // 属性调用
        .onChange(val => {
          console.log('密码:' + val)
        })
      TextInput({ placeholder: '确认密码'}) // 还可以传递事件
        .iptExtendStyleCallback((data: string) => {
          console.log('确认密码:' + data)
        })
    }
  }
}

3.多态

stateStyles() 可以依据组件的内部状态的不同,快速设置不同样式。

  • normal:正常态。

  • pressed:按压态。

  • focused:获焦态。

  • disabled:不可用态。

新建页面 LearnsStateStyles

@Extend(TextInput) function iptExtendStyle () {
  .height(60)
  .backgroundColor('#fff')
  .fontSize(26)
  .borderRadius(0)
  .border({
    width: { bottom: 2 },
    color: '#dadada'
  })
  .placeholderColor('#acacac')
  .placeholderFont({ size: 26 })
}
// cb: (data: string) => void
// cb 作为函数的参数
// (data: string) => void 代表的是cb参数的数据类型
// (data: string) => void 同时是一个函数,该函数没有返回值void,参数为data,data的数据类型为string
@Extend(TextInput) function iptExtendStyleCallback (cb: (data: string) => void) {
  .height(60)
  .backgroundColor('#fff')
  .fontSize(26)
  .borderRadius(0)
  .border({
    width: { bottom: 2 },
    color: '#dadada'
  })
  .placeholderColor('#acacac')
  .placeholderFont({ size: 26 })
  .onChange(cb)
}
​
@Entry
@Component
struct LearnExtend {
​
  build() {
    Column() {
      TextInput({ placeholder: '手机号'})
        .height(60)
        .backgroundColor('#fff')
        .fontSize(26)
        .borderRadius(0)
        .border({
          width: { bottom: 2 },
          color: '#dadada'
        })
        .placeholderColor('#acacac')
        .placeholderFont({ size: 26 })
        .onChange(val => {
          console.log('手机号:' + val)
        })
      TextInput({ placeholder: '密码'})
        .iptExtendStyle() // 属性调用
        .onChange(val => {
          console.log('密码:' + val)
        })
      TextInput({ placeholder: '确认密码'}) // 还可以传递事件
        .iptExtendStyleCallback((data: string) => {
          console.log('确认密码:' + data)
        })
    }
  }
}

三、代码调试

预览+日志的方式debug

这种方式只能进行基本数据类型的打印,适合简单调试

img

@Entry
  @Component
  struct Index {
    @State num:number = 111
    @State animal:{name: string,age:number}[] = [
      {name:'狗', age: 10},
      {name:'猫', age: 11},
    ]
​
    build() {
      Button('打印调试').onClick(() => {
        // 细节1:仅支持打印字符串
        // 细节2:所以遇到数值型就得转换   String()、toString() 模板字符串 字符串拼接
        // 细节3:所有遇到对象也的转换为字符串打印  或者 json数据格式
        // 细节4:预览器-没事,模拟器-打印必须加前缀 否则找不到
        // 致命一击:看的是预览器的打印, 测试的是模拟器
        // console.log(this.num)
        console.log('deepcode ', String(this.num))
        console.log('deepcode ', (this.num).toString())
        // console.log(this.animal)
        console.log('deepcode ', JSON.stringify(this.animal))
      })
    }
  }

断点调试

以模拟器为例

1. 点击编辑配置

img

2. 选择对应的entry

  • 安装方式一:先卸载应用/服务后,再重新安装,该方式会清除设备上的所有应用/服务缓存数据(默认安装方式)。

  • 安装方式二:采用覆盖安装方式,不卸载应用/服务,该方式会保留应用/服务的缓存数据

  • 采用默认安装即可

img

3. 多模块调试支持

如果一个工程中同一个设备存在多个模块(如Phone设备,存在entry和feature模块),且存在模块间的调用时,在调试阶段需要同时安装多个模块的hap包到设备中。此时,需要在Deploy Multi Hap中选择多个模块,启动调试时,DevEco Studio会将所有的模块都安装到设备上。DevEco Studio V3.1 Release开始支持

img

4. 点击应用后再点击确定完成配置

img

5. 开始调试

注意:提前打开模拟器,代码修改后需要重新点击进行调试

点击小绿logo进行断电调试

img

img

6. 相关功能键使用

按钮名称功能快捷键

img

Resume Program当程序执行到断点时停止执行,单击此按钮程序继续执行。F9(macOS为Option+Command+R

img

Step Over在单步调试时,直接前进到下一行(如果在函数中存在子函数时,不会进入子函数内单步执行,而是将整个子函数当作一步执行)。F8(macOS为F8

img

Step Into在单步调试时,遇到子函数后,进入子函数并继续单步执行。F7(macOS为F7

img

Force Step Into在单步调试时,强制进入方法。Alt+Shift+F7(macOS为Option+Shift+F7

img

Step Out在单步调试执行到子函数内时,单击Step Out会执行完子函数剩余部分,并跳出返回到上一层函数。Shift+F8(macOS为Shift+F8

img

Stop停止调试任务。Ctrl+F2(macOS为Command+F2

img

Run To Cursor断点执行到鼠标停留处。Alt+F9(macOS为Option+F9

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/903609.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows下使用nvm进行多版本nodejs管理

目录 一&#xff1a;背景 二&#xff1a;nvm的介绍 三&#xff1a;环境切换使用 一&#xff1a;背景 最近在开发node js的项目&#xff0c;其中一个项目的前端和后台使用了两个node版本&#xff0c;因此需要不同的环境配置来进行开发任务&#xff0c;刚好nvm这个插件可以实现…

vue使用高德地图实现轨迹显隐

<template><div><el-button type"primary" click"pathShowOrHide">轨迹显/隐</el-button><div id"container" /></div> </template><script> import AMapLoader from amap/amap-jsapi-loaderex…

Linux基础环境搭建(CentOS7)- 安装Scala和Spark

#Linux基础环境搭建&#xff08;CentOS7&#xff09;- 安装Scala和Spark Linux基础环境搭建&#xff08;CentOS7&#xff09;- 安装Scala和Spark 大家注意以下的环境搭建版本号&#xff0c;如果版本不匹配有可能出现问题&#xff01;&#xff08;spark不要下2.4版本的 会报错…

MySQL 日志之 binlog 格式 → 关于 MySQL 默认隔离级别的探讨

开心一刻 image 产品还没测试直接投入生产时&#xff0c;这尼玛... 背景问题 再讲 binlog 之前&#xff0c;我们先来回顾下主流关系型数据库的默认隔离级别&#xff0c;是默认隔离级别&#xff0c;不是事务有哪几种隔离级别&#xff0c;别会错题意了 1、Oracle、SQL Server 的默…

fastGpt

参考本地部署FastGPT使用在线大语言模型 1 rockylinx 1 ollama安装 在rockylinux中安装的&#xff0c;ollama由1.5G&#xff0c;还是比较大&#xff0c;所有采用在windows下下载&#xff0c;然后安装的方式&#xff0c;linux安装 tar -C /usr -xzf ollama-linux-amd64.tgz #…

让汇报结构清晰且重点突出的方法——金字塔原理

文章目录 1. 引入2. 什么是金字塔原理&#xff1f;3. 金字塔原理的 4 个要点4. 情景模拟&#xff08;项目进展汇报&#xff09;5. 小结 1. 引入 小编是一名平时埋头码代码&#xff0c;很少需要做正式的汇报&#xff0c;并且曾经一度不屑于只会做PPT和“讲故事”的人&#xff0…

小小猫棒onu替换家用光猫,薅运营商带宽羊毛,突破1000M

小小猫棒onu 一、总体步骤 1 记录原来光猫信息 主要包括SN&#xff0c;ploam密码&#xff0c;loid、loid密码、 mac、上网的vlan id等 一般gpon采用SN、ploam密码、SNploam密码三种中的一种认证方式 一般Epon采用loid&#xff08;逻辑id&#xff09;、mac、loid mac三种中…

8款全生命周期项目管理工具测评与比较

本文测评的8大主流全生命周期项目管理系统包括: 1. PingCode&#xff1b;2. Worktile&#xff1b;3. 腾讯Tapd&#xff1b;4. 蓝湖&#xff08;Lanhu&#xff09;&#xff1b;5. 有道云协作&#xff1b;6. ProcessOn&#xff1b;7. Monday.com&#xff1b;8. Basecamp。 在众多…

java-web-day5

1.spring-boot-web入门 目标: 开始最基本的web应用的构建 使用浏览器访问后端, 后端给浏览器返回HelloController 流程: 1.创建springboot工程, 填写模块信息, 并勾选web开发的相关依赖 注意: 在新版idea中模块创建时java下拉框只能选17, 21, 23 这里选17, maven版本是3.6.3, 很…

自适应神经网络架构:原理解析与代码示例

个人主页&#xff1a;chian-ocean 文章专栏 自适应神经网络结构&#xff1a;深入探讨与代码实现 1. 引言 随着深度学习的不断发展&#xff0c;传统神经网络模型在处理复杂任务时的局限性逐渐显现。固定的网络结构和参数对于动态变化的环境和多样化的数据往往难以适应&#…

【32】C++流

目录 C流 读写文件&#xff1a;文件流 对文本文件流读写 写文本文件 读文本文件 对二进制文件流读写 写二进制文件 读二进制文件 对文件流按格式读写取数据 按指定格式写文件 按指定格式读文件 C流 IO: 向设备输入数据和输出数据 C的IO流 设备: 文件控制台特定的数…

前端对一个增删改查的思考

1、来源&#xff1a;dify dify/web/app/components/workflow/nodes/question-classifier/components/class-list.tsx at main langgenius/dify GitHub 2、代码流程&#xff1a; 3、思索问题&#xff1a; 1、为啥要用return形式&#xff0c;而不是value直接当函数&#xff1…

网络原理(数据链路层)->以太网帧格式解

前言 大家好我是小帅&#xff0c;今天我们来了解以太网帧格式 个人主页 文章目录 1.数据链路层1.1 认识以太⽹1.2 MAC地址&#xff08;⽹卡的硬件地址&#xff09;1.2.1 对⽐理解MAC地址和IP地址 1.3 认识MTU1.4 MTU对IP协议的影响1. 5 MTU对UDP协议的影响1.6 MTU对于TCP协议的…

高校智慧党建系统

摘 要 随着社会的发展&#xff0c;系统的管理形势越来越严峻。越来越多的用户利用互联网获得信息&#xff0c;但各种信息鱼龙混杂&#xff0c;信息真假难以辨别。为了方便用户更好的获得高校智慧党建管理信息&#xff0c;因此&#xff0c;设计一种安全高效的高校智慧党建系统…

【jq+css+html】移动web案例课美团外卖

首页 <!DOCTYPE html> <html> <head><title>首页</title><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalable0" /><scr…

【01初识】-初识 RabbitMQ

目录 学习背景1- 初识 MQ1-1 同步调用什么是同步调用&#xff1f;小结&#xff1a;同步调用优缺点 1-2 异步调用什么是异步调用&#xff1f;小结&#xff1a;异步调用的优缺点&#xff0c;什么时候使用异步调用&#xff1f; 1-3 MQ 技术选型 学习背景 异步通讯的特点&#xff…

centos下面的jdk17的安装配置

文章目录 1.基本指令回顾2.jdk17的安装到这个centos上面2.1首先切换到这个root下面去2.2查看系统jdk版本2.3首先到官网找到进行下载2.4安装包的上传2.5jdk17的安装包的解压过程2.6配置环境变量2.7是否设置成功&#xff0c;查看版本 1.基本指令回顾 ls:list也就是列出来这个目录…

基于【图像识别】基于模板匹配实现蓝色、绿色、黄色车牌识别附matlab代码

车牌识别是智能交通系统的重要部分&#xff0c;主要涉及模式识别、数字图像处理、计算机应用和人工智能等学科。车牌识别过程主要由车牌定位、车牌字符分割和车牌字符识别组成。文中主要对车牌字符识别进行了研究&#xff0c;并在MATLAB环境下进行了相应的实验。文中在车牌字符…

SpringAOP:对于同一个切入点,不同切面不同通知的执行顺序

目录 1. 问题描述2. 结论结论1&#xff1a;"对于同一个切入点&#xff0c;同一个切面不同类型的通知的执行顺序"结论2&#xff1a;"对于同一个切入点&#xff0c;不同切面不同类型通知的执行顺序" 3. 测试环境&#xff1a;SpringBoot 2.3.4.RELEASE测试集合…

jeecgbootvue2菜单路由配置静态文件夹(public)下的html

需求:想要在菜单配置src/assets/iconfont/chart.html显示页面(目的是打包上线以后运维依然可以修改数据) 官网没有相关数据&#xff1a;菜单配置说明 JeecgBoot 开发文档 看云 问题现象: 我把文件放在src/assets/iconfont/chart.html然后在vue中作为 iframe 的 src 属性&am…