鸿蒙系统的开发与学习

1.开发工具的下载

DevEco Studio-HarmonyOS Next Beta版-华为开发者联盟

 安装、环境配置时,建议 自定义目录
注意:路径中不要有 中文、特殊字符。

2.ArkTS基础总结

1)三种数据类型

string 字符串:描述信息
number 数字:计算
boolean 布尔:判断 (真、假)

2)数组,函数,对象

Person =
{
name: ' 杨幂 ' ,
age: 18 ,
weight: 90
}

接口(属性)

interface Person {
name : string
age : number
weight : number
}
接口(方法)
interface Person {
dance : () => void
sing : ( song: string ) => void
}

联合类型

let judge : number | string = 100

枚举类型

enum Theme Color {
Red = '#ff0f29' ,
Orange = '#ff7100' ,
Green = '#30b30e'
}

ArkTS其实就是ts的超集,而且一般用的就是js

3. 界面开发起步

1)log里面看console.log输出的内容

2) 鸿蒙里面没有html的body,div,有的只是row(),column(),还有image,button一类的和html差不多的组件,就像vue2里面你要有一个最大的div块一样,你要保证你的build()里面有一个column(),然后往里面可以继续放column()和row(),然后row()和column()里面可以放text()和image()等等

3)给column()组件加方法,比如说控制它的高度,宽度什么的,需要下面这样写
 ,每个组件的具体属性需要自己去搜,和html差不多,高度长度,字体大小一类的,还有padding,margin,border

    Column() {
Text('123').width()
.height()}.width('100%').layoutWeight(1) // 让容器高度自适应.backgroundColor(Color.Orange)

4)设置文字溢出省略号 

. textOverflow ({
overflow: TextOverflow. Ellipsis
})
. maxLines ( 数字 ) 控制最大行数
设置行高
.lineHeight( 数字 )
Text('方舟...')
.textOverflow({
overflow: TextOverflow.Ellipsis}).maxLines(2).lineHeight(30)

 5)Image组件两种用法,一般用svg文件,可放大缩小不失真

网络图片
Image(‘https://............)
本地图片
你要把图片放在指定的目录里
main---->resources---->base---->media
Image($r('app.media.product))

6)给容器之间加间隔,可以下面这样写,这也是与html不一样的地方,方便了很多

如何调整组件之间的距离?
给外层容器组件加 { space: 数字 }Column({space:20}){
Text()
Button()
}
这样text和button就会有20px的间隔

7)圆角,正圆和胶囊

  Column() {// 1. 正圆 (头像)Image($r('app.media.cat')).width(100).height(100).borderRadius(50)// 2. 胶囊按钮 (左右半圆)Text('今天还没打卡呦~').width(240).height(60).borderRadius(30).backgroundColor(Color.Pink).margin({ top: 20 })}.padding(20)

8)背景多了一些新的东西

 // backgroundImagePosition// 1. 传入对象, 设置位置坐标,背景图片的左顶点//    { x: 坐标值, y: 坐标值 }//    注意:坐标值的单位,和宽高的默认单位不同的,显示出来大小会不同//// 2. Alignment 枚举,设置一些特殊的位置(中央、左顶点...)//    Center  TopStart左顶点 TopEnd右顶点 BottomEnd右下...Text().width(300).height(200).backgroundColor(Color.Pink).backgroundImage($r('app.media.flower')).backgroundImagePosition({x: 400,y: 300}).backgroundImagePosition(Alignment.BottomEnd)}.padding(20)

9)这里引出来一个新的单位,不是px,是vp
px转换为vp的方法vp2px

 Text().width('300vp').height('200vp').backgroundColor(Color.Pink).backgroundImage($r('app.media.flower')).backgroundImagePosition({x: vp2px(150),y: vp2px(100)})}.padding(20)

10)主轴对齐方式(column和row都可以为主轴),这里和flex差不多,它这里面也还可以引入flex,grid

    Column() {Text().width(200).height(100).backgroundColor(Color.Pink).border({ width: 2 })Text().width(200).height(100).backgroundColor(Color.Pink).border({ width: 2 }).margin(5)Text().width(200).height(100).backgroundColor(Color.Pink).border({ width: 2 }).margin(5)Text().width(200).height(100).backgroundColor(Color.Pink).border({ width: 2 })}.width('100%').height('100%').backgroundColor('#ccc')// 设置排布主方向的对齐方式(主轴)// 1. Start  (排布主方向)主轴起始位置对齐// 2. Center  主轴居中对齐// 3. End     主轴结束位置对齐// 4. SpaceBetween 贴边显示,中间的元素均匀分布间隙// 5. SpaceAround 间隙环绕  0.5  1  1  1  0.5 的间隙分布,靠边只有一半的间隙// 6. SpaceEvenly 间隙均匀环绕,靠边也是完整的一份间隙// justifyContent(枚举FlexAlign)  ctrl+p  cmd+p// .justifyContent(FlexAlign.Center)// .justifyContent(FlexAlign.SpaceBetween)// .justifyContent(FlexAlign.SpaceAround).justifyContent(FlexAlign.SpaceEvenly)

11)交叉轴对齐方式

build() {// Column 交叉轴的对齐方式(水平往右)// alignItems(HorizontalAlign.Start)  Center EndColumn() {Text().width(200).height(100).backgroundColor(Color.Pink).border({ width: 2 })Text().width(200).height(100).backgroundColor(Color.Pink).border({ width: 2 }).margin({ top: 5, bottom: 5 })Text().width(200).height(100).backgroundColor(Color.Pink).border({ width: 2 })}.alignItems(HorizontalAlign.End).width('100%').height('100%').backgroundColor('#ccc')

12)layoutWeight 自适应伸缩: 按照[份数权重],分配[剩余空间]

    Column() {// layoutWeight 自适应伸缩: 按照[份数权重],分配[剩余空间]Row() {Text('左侧').layoutWeight(1).height(40).backgroundColor(Color.Pink)Text('右侧固定').width(80).height(40).backgroundColor(Color.Orange)}.width(300).height(40).backgroundColor('#fff')Row() {Text('老大').layoutWeight(1).height(40).backgroundColor(Color.Gray)Text('老二').layoutWeight(2).height(40).backgroundColor(Color.Orange)Text('老三').layoutWeight(3).height(40).backgroundColor(Color.Pink)Text('小宝').width(50).height(40).backgroundColor(Color.Brown)}.width(300).height(40).backgroundColor('#fff').margin({ top: 30 })}.padding(10).width('100%').height('100%').backgroundColor('#ccc')

13)flex

  // Flex默认主轴水平往右,交叉轴垂直往下 → Row// 1. 主轴方向//    direction: FlexDirection.Row / Column// 2. 主轴对齐方式//    justifyContent: FlexAlign.SpaceAround// 3. 交叉轴对齐方式//    alignItems: ItemAlign.Stretch / Start / Center / End// 单行或者单列的情况,优先还是使用线性布局(本质基于Flex设计的,且还做了性能优化)// Flex布局:伸缩布局。当子盒子的总和溢出父盒子,默认进行压缩显示。// 4. 换行 wrap//    FlexWrap.Wrap 换行//    FlexWrap.NoWrap 不换行Flex({wrap: FlexWrap.Wrap}) {Text().width(80).height(80).backgroundColor(Color.Pink).border({ width: 1, color: Color.Blue })Text().width(80).height(80).backgroundColor(Color.Pink).border({ width: 1, color: Color.Blue })Text().width(80).height(80).backgroundColor(Color.Pink).border({ width: 1, color: Color.Blue })Text().width(80).height(80).backgroundColor(Color.Pink).border({ width: 1, color: Color.Blue })Text().width(80).height(80).backgroundColor(Color.Pink).border({ width: 1, color: Color.Blue })}.width(300).height(300).backgroundColor('#5f9a5c')

14)绝对定位和zindex

   // position绝对定位:可以控制组件位置,可以实现层叠效果// 语法:// .position({//   x: 50,//   y: 50// })// 特点:// 1. 相对于父组件左顶点进行偏移(调整位置)// 2. 原本的位置不占了,且可以任意调整位置,不影响其他元素// 后面的组件明显层次更高,会盖住前面的组件// 需求:不动结构的情况下,调整组件的层级 .zIndex(数字)Column() {Text('大儿子').width(80).height(80).backgroundColor(Color.Green).zIndex(3)Text('二儿子定位').width(80).height(80).backgroundColor(Color.Yellow).position({x: 50,y: 50}).zIndex(4)Text('三儿子').width(80).height(80).backgroundColor(Color.Orange).zIndex(2)}.width(300).height(300).backgroundColor(Color.Pink)

15)层叠布局

 // 层叠布局Stack({alignContent: Alignment.Bottom}) {Text('大儿子').width(250).height(250).backgroundColor(Color.Green).zIndex(3)Text('二儿子').width(150).height(150).backgroundColor(Color.Orange).zIndex(4)Text('三儿子').width(50).height(50).backgroundColor(Color.Yellow).zIndex(5)}.width(300).height(600).backgroundColor(Color.Pink)

下面是前端的一个综合示例:B站-视频卡片

@Entry
@Component
struct Index {build() {Column() {// b站视频卡片Column() {// 1. 上面图片区域(层叠布局)Stack({ alignContent: Alignment.Bottom }) {Image($r('app.media.bz_img')).borderRadius({topLeft: 10,topRight: 10})Row() {Row({ space: 5 }){Image($r('app.media.bz_play')).width(14).fillColor(Color.White)Text('288万').fontSize(12).fontColor(Color.White)}.margin({ right: 10 })Row({ space: 5 }){Image($r('app.media.bz_msg')).width(14).fillColor(Color.White)Text('8655').fontSize(12).fontColor(Color.White)}Blank()Text('4:33').fontSize(12).fontColor(Color.White)}.height(24).padding({ left: 5, right: 5 }).width('100%')}.width('100%').height(125)// 2. 底部文字区域Column() {Text('【凤凰传奇新歌】欢迎来到国风统治区:唢呐一响神曲《铁衣流派推广曲》').fontSize(13).lineHeight(16).textOverflow({ overflow: TextOverflow.Ellipsis }).maxLines(2)Row() {Text('19万点赞').fontSize(10).fontColor('#e66c43').backgroundColor('#fef0ef').padding(5).borderRadius(2)Image($r('app.media.bz_more')).width(14)}.margin({ top: 6 }).width('100%').justifyContent(FlexAlign.SpaceBetween)}.padding(5)}.width(200).height(200).backgroundColor(Color.White).borderRadius(10).margin({ top: 10 })}.width('100%').height('100%').backgroundColor('#ccc')}
}

4.上面说了一些前端的部分,下面说一下后端部分


1)字符串拼接+模板字符串的用法

用``还有${}
// let hobby: string = '打拳'
// console.log('简介信息', `姓名: ${name}, 年纪: ${age}岁, 爱好: ${hobby}`)

2)一些js的基础知识

1)数字转字符串
// 将数字转字符串, toString()  toFixed()
// 1. 数据.toString() 原样转字符串
console.log('toString:', money.toString())// 2. 数据.toFixed(保留几位小数)  四舍五入
console.log('toFixed:', money.toFixed())
console.log('toFixed:', money.toFixed(2))
2)点击事件还是onclickText('我是文本').onClick(() => {// 弹个框AlertDialog.show({message: '你好~ 我是文本组件'})})

3)鸿蒙多了一个状态变量

普通变量:只能在初始化时渲染,后续将不会再刷新。
状态变量:需要装饰器装饰,改变会引起 UI 的渲染刷新 (必须设置 类型 和 初始值)
struct Index {// 组件内的[普通变量] this.xxxmyAge: number = 18// 组件内的[状态变量] this.xxx@State myMsg: string = 'hello 黑马'build() {Column() {Text(myName).onClick(() => {myName = '貂蝉'console.log('myName', myName)})Text(this.myAge.toString()).onClick(() => {this.myAge = 200console.log('myAge', this.myAge)})Text(this.myMsg).onClick(() => {this.myMsg = '你好 状态'})}}
}

简单后端的例子:抽卡

// 定义接口 (每个列表项的数据结构)
interface ImageCount {url: stringcount: number
}// 0 1 2 3 4 5
// [0,1) * 6  =>  [0,6)
// 求随机数: Math.random
// 向下取整: Math.floor
// console.log('随机数', Math.floor(Math.random() * 6))@Entry
@Component
struct Index {// 随机的生肖卡序号 0-5@State randomIndex: number = -1 // 表示还没开始抽// 基于接口, 准备数据@State images: ImageCount[] = [{ url: 'app.media.bg_00', count: 0 },{ url: 'app.media.bg_01', count: 0 },{ url: 'app.media.bg_02', count: 0 },{ url: 'app.media.bg_03', count: 0 },{ url: 'app.media.bg_04', count: 0 },{ url: 'app.media.bg_05', count: 0 }]// 控制遮罩的显隐@State maskOpacity: number = 0 // 透明度@State maskZIndex: number = -1 // 显示层级// 控制图片的缩放@State maskImgX: number = 0 // 水平缩放比@State maskImgY: number = 0 // 垂直缩放比// 控制中大奖遮罩的显隐@State isGet: boolean = false@State arr: string[] = ['pg', 'hw', 'xm'] // 奖池@State prize: string = '' // 默认没中奖build() {Stack() {// 初始化的布局结构Column() {Grid() {ForEach(this.images, (item: ImageCount, index: number) => {GridItem() {Badge({count: item.count,position: BadgePosition.RightTop,style: {fontSize: 14,badgeSize: 20,badgeColor: '#fa2a2d'}}) {Image($r(item.url)).width(80)}}})}.columnsTemplate('1fr 1fr 1fr').rowsTemplate('1fr 1fr').width('100%').height(300).margin({ top: 100 })Button('立即抽卡').width(200).backgroundColor('#ed5b8c').margin({ top: 50 }).onClick(() => {// 点击时, 修改遮罩参数, 让遮罩显示this.maskOpacity = 1this.maskZIndex = 99// 点击时, 图片需要缩放this.maskImgX = 1this.maskImgY = 1// 计算随机数 Math.random()  [0,1) * (n + 1)this.randomIndex = Math.floor(Math.random() * 6)})}.width('100%').height('100%')// 抽卡遮罩层 (弹层)Column({ space: 30 }) {Text('获得生肖卡').fontColor('#f5ebcf').fontSize(25).fontWeight(FontWeight.Bold)Image($r(`app.media.img_0${this.randomIndex}`)).width(200)// 控制元素的缩放.scale({x: this.maskImgX,y: this.maskImgY}).animation({duration: 500})Button('开心收下').width(200).height(50).backgroundColor(Color.Transparent).border({ width: 2, color: '#fff9e0' }).onClick(() => {// 控制弹层显隐this.maskOpacity = 0this.maskZIndex = -1// 图像重置缩放比为 0this.maskImgX = 0this.maskImgY = 0// 开心收下, 对象数组的情况需要更新, 需要修改替换整个对象// this.images[this.randomIndex].count++this.images[this.randomIndex] = {url: `app.media.img_0${this.randomIndex}`,count: this.images[this.randomIndex].count + 1}// 每次收完卡片, 需要进行简单的检索, 判断是否集齐// 需求: 判断数组项的count, 是否都大于0, 只要有一个等于0,就意味着没集齐let flag: boolean = true // 假设集齐// 验证是否集齐for (let item of this.images) {if (item.count == 0) {flag = false // 没集齐break // 后面的没必要判断了}}this.isGet = flag// 判断是否中奖了, 如果是 需要抽奖if (flag) {let randomIndex: number = Math.floor(Math.random() * 3)this.prize = this.arr[randomIndex]}})}.justifyContent(FlexAlign.Center).width('100%').height('100%')// 颜色十六进制色值,如果是八位,前两位,就是透明度.backgroundColor('#cc000000')// 设置透明度.opacity(this.maskOpacity).zIndex(this.maskZIndex)// 动画 animation, 当我们元素有状态的改变,可以添加animation做动画.animation({duration: 200})// 抽大奖的遮罩层if (this.isGet) {Column({ space: 30 }) {Text('恭喜获得手机一部').fontColor('#f5ebcf').fontSize(25).fontWeight(700)Image($r(`app.media.${this.prize}`)).width(300)Button('再来一次').width(200).height(50).backgroundColor(Color.Transparent).border({ width: 2, color: '#fff9e0' }).onClick(() => {this.isGet = falsethis.prize = ''this.images = [{ url: 'app.media.bg_00', count: 0 },{ url: 'app.media.bg_01', count: 0 },{ url: 'app.media.bg_02', count: 0 },{ url: 'app.media.bg_03', count: 0 },{ url: 'app.media.bg_04', count: 0 },{ url: 'app.media.bg_05', count: 0 }]})}.justifyContent(FlexAlign.Center).width('100%').height('100%').backgroundColor('#cc000000')}}}
}

5.轮播swiper组件

最简单的例子Column() {// Swiper 轮播组件的基本使用// 1. Swiper 包内容// 2. Swiper 设尺寸Swiper() {Text('1').backgroundColor(Color.Orange)Text('2').backgroundColor(Color.Yellow)Text('3').backgroundColor(Color.Brown)}.width('100%').height(100)Swiper() {Image($r('app.media.ic_swiper_xmyp01'))Image($r('app.media.ic_swiper_xmyp02'))Image($r('app.media.ic_swiper_xmyp03'))Image($r('app.media.ic_swiper_xmyp04'))}.width('100%').height(150)}
常见属性.loop(true) // 开启循环.autoPlay(true) // 自动播放.interval(5000) // 自动播放间隔.vertical(true) // 纵向
// 定制小圆点// .indicator(false).indicator(Indicator.dot().itemWidth(20).itemHeight(20).color(Color.Black).selectedItemWidth(25).selectedItemHeight(25).selectedColor(Color.White))
完整代码
@Entry
@Component
struct Index {build() {Column() {// 1. Swiper轮播容器 (填入内容)Swiper() {Image($r('app.media.1')).objectFit(ImageFit.Cover)Image($r('app.media.2')).objectFit(ImageFit.Cover)Image($r('app.media.3')).objectFit(ImageFit.Cover)Image($r('app.media.4')).objectFit(ImageFit.Cover)Image($r('app.media.5')).objectFit(ImageFit.Cover)}// 2. 设置尺寸.width('100%').height('100%')// 3. 定制方向和小圆点.vertical(true) // 纵向轮播.indicator(Indicator.dot() // 小圆点样式.color(Color.White).selectedColor(Color.Orange))}}
}

6.@Extend-扩展组件(样式,事件)

扩展 组件的 样式、事件 ,实现 复用 效果
@Extend(Text)
function textExtend(color: ResourceColor, txt: string) {
.textAlign(TextAlign.Center)
.backgroundColor(color)
.fontColor(Color.White)
.fontSize(30)
.onClick(() => {
AlertDialog.show({
message: txt
})
})
}
Text('1')
.textExtend(Color.Red, '轮播图1')

7.@Styles: 抽取通用属性、事件

// 1. 全局定义
@Styles function commonStyles() {
.width(100)
.height(100)
.onClick(()=>{ })
}
@Component
struct FancyDemo {
// 2. 在组件内定义@Styles setBg() {
.backgroundColor(this.Color)
}
builder(){
Text().commonStyles()
.setBg()
}
}

8.@Builder:自定义构建函数(结构、样式、事件

类似于vue里面的混入(Mixins)

// 全局 Builder
@Builder
function navItem(icon: ResourceStr, txt: string) {Column({ space: 10 }) {Image(icon).width('80%')Text(txt)}.width('25%').onClick(() => {AlertDialog.show({message: '点了' + txt})})
}@Entry
@Component
struct BuilderDemo {@State message: string = '@Builder';@BuildernavItem(icon: ResourceStr, txt: string) {Column({ space: 10 }) {Image(icon).width('80%')Text(txt)}.width('25%').onClick(() => {AlertDialog.show({message: '点了' + txt + this.message})})}build() {Column({ space: 20 }) {Text(this.message).fontSize(30)Row() {Row() {navItem($r('app.media.ic_reuse_01'), '阿里拍卖')navItem($r('app.media.ic_reuse_02'), '菜鸟')this.navItem($r('app.media.ic_reuse_03'), '巴巴农场')this.navItem($r('app.media.ic_reuse_04'), '阿里药房')}}}.width('100%').height('100%')}}

9.滚动容器 Scroll

@Entry
@Component
struct Index {build() {Column() {// 如果希望内容溢出, 能够滚动Scroll() {Column({ space: 10 }) {ForEach(Array.from({ length: 10 }), (item: string, index) => {Text('测试文本' + (index + 1)).width('100%').height(100).textAlign(TextAlign.Center).backgroundColor(Color.Orange).fontSize(20).fontColor(Color.White).borderRadius(10)})}.padding(10).width('100%')}.width('100%').height(400).scrollable(ScrollDirection.Vertical) // 设置滚动方向.scrollBar(BarState.Auto) // On一直显示 Off一直隐藏 Auto滑动显示.scrollBarColor(Color.Blue) // 滚动条颜色.scrollBarWidth(5) // 滚动条宽度.edgeEffect(EdgeEffect.Spring) // 滑动效果}}
}

10.容器组件 Tabs

当页面内容较多时,可以通过Tabs组件进行 分类展示

@Entry
@Component
struct Index {build() {Tabs({ barPosition: BarPosition.Start }) {TabContent() {Text('首页内容') // 有且只能一个子组件}.tabBar('首页') // 配置导航TabContent() {Text('推荐内容') // 有且只能一个子组件}.tabBar('推荐')TabContent() {Text('发现内容') // 有且只能一个子组件}.tabBar('发现')TabContent() {Text('我的内容') // 有且只能一个子组件}.tabBar('我的')}.vertical(false) // 调整导航水平或垂直.scrollable(false) // 是否开启手势滑动.animationDuration(0) // 点击滑动的动画时间}
}@Entry
@Component
struct Index {titles: string[] = ['首页','关注','热门','军事','体育','八卦','数码','财经','美食','旅行']build() {// 生成10个面板 → 10个小导航Tabs() {ForEach(this.titles, (item: string, index) => {TabContent() {Text(`${item}内容`)}.tabBar(item)})}// barMode属性, 可以实现滚动导航栏.barMode(BarMode.Scrollable)}
}

11.class类

静态属性和静态方法是给类本身加的,不是给实例加的

在 ArkTS 中 ...(展开运算符) 只能用在数组上泛型约束,泛型接口,泛型类

12.模块化

13.自定义组件

 

14. @BuilderParam传递UI

15.状态管理

 

interface Person {name: stringage: number
}@Entry
@Component// 父组件
struct KnowledgePage {@State count: number = 0@State person: Person = {name: 'zs',age: 18}build() {Column() {Text('父组件').fontSize(30)Text(this.count.toString())Text(JSON.stringify(this.person))Button('修改数据').onClick(() => {this.count++})SonComponent({count: this.count,person: this.person})}.padding(10).height('100%').backgroundColor('#eee').width('100%').alignItems(HorizontalAlign.Center).padding({ top: 100 })}
}@Component// 子组件
struct SonComponent {@Link count: number@Link person: Person// 编写 UIbuild() {Column({ space: 20 }) {Text('我是子组件').fontSize(20)Text(this.count.toString())Text(JSON.stringify(this.person))Column() {Button('修改数据').onClick(() => {// this.count++this.person.age++})}}.backgroundColor('#a6c398').alignItems(HorizontalAlign.Center).width('80%').margin({ top: 100 }).padding(10).borderRadius(10)}
}

interface Car {name: stringbrand: string
}@Entry
@Component// 顶级组件
struct RootComponent {@Provide themeColor: string = 'yellow'@Provide car: Car = {name: '小黄',brand: '美团'}build() {Column() {Text('顶级组件').fontSize(30).fontWeight(900)Text(this.themeColor)Text(JSON.stringify(this.car))// 二级组件ParentComponent()ParentComponent()}.padding(10).height('100%').backgroundColor('#ccc').width('100%').alignItems(HorizontalAlign.Center).padding({ top: 100 })}
}@Component// 二级组件
struct ParentComponent {@Consume themeColor: string// 编写 UIbuild() {Column({ space: 20 }) {Text('我是二级组件').fontSize(22).fontWeight(900)Text(this.themeColor)// 内层子组件SonComponent()}.backgroundColor('#a6c398').alignItems(HorizontalAlign.Center).width('90%').margin({ top: 50 }).padding(10).borderRadius(10)}
}@Component// 内层组件
struct SonComponent {@Consume themeColor: string@Consume car: Car// 编写 UIbuild() {Column({ space: 20 }) {Text('我是内层组件' + this.themeColor).fontSize(20).fontWeight(900).onClick(() => {// this.themeColor = 'orange'this.car.name = '小绿'})Text(JSON.stringify(this.car))}.backgroundColor('#bf94e4').alignItems(HorizontalAlign.Center).width('90%').margin({ top: 50 }).padding(10).borderRadius(10)}
}

interface IPerson {id: numbername: stringage: number
}@Observed
class Person {id: numbername: stringage: numberconstructor(obj: IPerson) {this.id = obj.idthis.name = obj.namethis.age = obj.age}
}@Entry
@Component
struct ObservedAndLink {@State personList: Person[] = [new Person({id: 1,name: '张三',age: 18}),new Person({id: 2,name: '李四',age: 19}),new Person({id: 3,name: '王五',age: 20})]build() {Column({ space: 20 }) {Text('父组件').fontSize(30)List({ space: 10 }) {ForEach(this.personList, (item: Person, index: number) => {ItemCom({info: item,addAge: () => {// 修改嵌套的数据 => 普通的情况, 监视不到更新item.age++ // 如果能监视到AlertDialog.show({message: JSON.stringify(this.personList)})// this.personList.splice(index, 1, item) // 无需手动替换更新}})})}}.backgroundColor('#cbe69b').width('100%').height('100%').padding(20)}
}@Component
struct ItemCom {@ObjectLink info: PersonaddAge = () => {}build() {ListItem() {Row({ space: 10 }) {Text('姓名:' + this.info.name)Text('年龄:' + this.info.age)Blank()Button('修改数据').onClick(() => {// this.addAge()this.info.age++})}.backgroundColor(Color.Pink).padding(10).width('100%')}}
}

16.路由

 页面路由指的是在应用程序中实现 不同页面之间的跳转,以及数据传递。

16.生命周期

 

17. 打包

鸿蒙ArsTS项目创建打包发布流程_arkts 如何打包成app-CSDN博客
文章内容总结于
01-环境备选方案-API10-开发工具下载_哔哩哔哩_bilibili

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java后端每日面试题(day1)

目录 JavaWeb三大组件依赖注入的方式Autowire和Resurce有什么区别?Spring Boot的优点Spring IoC是什么?说说Spring Aop的优点Component和Bean的区别自定义注解时使用的RetentionPolicy枚举类有哪些值?如何理解Spring的SPI机制?Spr…

听说现在AI产品经理薪资30k起步?0基础可以转行AI产品吗?

2024年,还有什么新风口? AI、元宇宙、NFT… 很多人不知道,其实不管是元宇宙还是NFT,它们本质上就是人工智能领域。 AI自身应用领域非常广泛,大批高薪岗位随之涌了出来,包括AI产品经理。 AI产品经历具体工…

【LeetCode:841. 钥匙和房间 + DFS】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

安卓手机已删除短信如何恢复?这2个技巧,找回离家出走的短信

手机宛如一座丰富的宝库,珍藏着生活中的点滴回忆。其中,短信作为沟通的桥梁,记录着我们与亲朋好友间的温情脉脉,承载着无数珍贵的瞬间。然而,有时,我们却会不慎触发宝库中的机关,使得这些宝贵的…

【计算智能】遗传算法(二):基本遗传算法在优化问题中的应用【实验】

前言 本系列文章架构概览: 本文将介绍基本遗传算法在解决优化问题中的应用,通过实验展示其基本原理和实现过程:选取一个简单的二次函数作为优化目标,并利用基本遗传算法寻找其在指定范围内的最大值。 2. 基本遗传算法(SGA&#x…

从0构建一款appium-inspector工具

上一篇博客从源码层面解释了appium-inspector工具实现原理,这篇博客将介绍如何从0构建一款简单的类似appium-inspector的工具。如果要实现一款类似appium-inspector的demo工具,大致需要完成如下六个模块内容 启动 Appium 服务器连接到移动设备或模拟器启…

vue 中 使用腾讯地图 (动态引用腾讯地图及使用签名验证)

在设置定位的时候使用 腾讯地图 选择地址 在 mounted中引入腾讯地图: this.website.mapKey 为地图的 key // 异步加载腾讯地图APIconst script document.createElement(script);script.type text/javascript;script.src https://map.qq.com/api/js?v2.exp&…

SS8812T替代DRV8812的国产双通道H桥电机驱动芯片

由工采网代理的SS8812T是一款国产双通道H桥电机驱动芯片;该芯片为打印机和其它电机一体化应用提供一种双通道集成电机驱动方案;可Pin-to-Pin兼容替代DRV8812,可广泛应用于POS、打印机、安防相机、办公自动化设备、游戏机、机器人等。 产品描述…

Vue.js 案例——商品管理

一.需要做出的效果图&#xff1a; 二.实现的步骤 首先&#xff0c;先建一个项目&#xff0c;命名Table&#xff0c;在Table项目中的components里新建一个MyTable.vue文件。 第二步&#xff0c;在原有的 HelloWorld.vue中写入代码。 HelloWorld.vue代码如下&#xff1a; <…

KumiaoQQ机器人框架源码

源码介绍 酷喵机器人框架基于PC协议与MGCH的结合&#xff0c;MGCH即 MiraiGO-CQhttp&#xff08;代码类型&#xff1a;易语言&#xff09;基本的API功能已经实现&#xff0c;具体可自测&#xff08;教程/日志/说明文本已附带&#xff09;开放源码仅供参考学习交流&#xff0c;…

远超美国!中国AI专利数量全球第一!商汤推出面向C端用户大模型“Vimi”,可生成分钟级视频!|AI日报

文章推荐 苹果获得OpenAI董事会观察员职位&#xff01;Runway正筹集新一轮融资&#xff0c;估值40亿美元&#xff01;&#xff5c;AI日报 AI基准测评&#xff08;下&#xff09;&#xff1a;视频生成、代码能力、逻辑推理&#xff0c;AI是否已经超越人类&#xff1f; 联合国…

【linux高级IO(一)】理解五种IO模型

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux高级IO 1. 前言2. 重谈对…

kubernetes dashboard安装

1.查看符合自己版本的kubernetes Dashboard 比如我使用的是1.23.0版本 https://github.com/kubernetes/dashboard/releases?page5 对应版本 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml修改对应的yaml,…

adb不插usb线通过wifi调试

说起做手机开发也有好多年了&#xff0c;说来惭愧&#xff0c;我最近才知道安卓手机是可以不插数据线进行开发调试的。起因是公司近期采购了一批安卓一卡通设备&#xff0c;需要对其进行定制开发APP,但是由于我插USB调试发现没有反应。通过询问厂家才知道可以通过WIFI进行调试。…

请注意,以下这几种操作都会导致流量卡被停用!

最近一段时间&#xff0c;小编经常收到一些反馈&#xff0c;明明是刚办理的手机号还没有用几天就被停用了&#xff0c;今天&#xff0c;这篇文章我们要了解就是手机号被停用的问题。 ​ 对于新办理的手机号会被停用这个问题&#xff0c;主要还是因为运营商为了防止电话诈骗&…

java数据结构集合复习之包装类和泛型

前言: 这是我最一年学习java的一部分的回顾总结 1.包装类 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java给每个基本类型都对应了一个包装类型。 1.1基本数据类型和对应的包装类 ----—基本数据类型包装类…

ubuntu软件源的两种格式和环境变量

1. ubuntu的/etc是什么目录&#xff1f; 在Ubuntu操作系统中&#xff0c;/etc/是一个特殊的目录&#xff0c;它包含系统的配置文件。这些配置文件用于设置各种系统和应用程序的参数和选项。 一般来说&#xff0c;用户可以在这个目录下找到各种重要的配置文件&#xff0c;如网络…

Web3 ETF的主要功能

Web3 ETF的主要功能可以概括为以下几点&#xff0c;Web3 ETF仍是一项新兴投资产品&#xff0c;其长期表现仍存在不确定性。投资者在投资Web3 ETF之前应仔细研究相关风险&#xff0c;并做好充分的风险评估。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xf…

商务办公优选!AOC Q27E3S2商用显示器,打造卓越新体验!

摘要&#xff1a;助办公室一族纵横职场&#xff0c;实现高效舒适办公&#xff01; 在日常商务办公中&#xff0c;对于办公室一族来说总有太多“难难难难难点”&#xff1a;工作任务繁琐&#xff0c;熬夜加班心力交瘁、长时间伏案工作导致颈椎、眼睛等出现问题&#xff0c;职业…

BBA车主,千万别去试驾问界M9

文 | AUTO芯球 作者 | 雷慢&响铃 我劝你啊&#xff0c;千万别去试驾问界M9&#xff0c; 不然啊&#xff0c;可能1个小时50万就没了&#xff0c; 不信你看这个“大冤种”&#xff0c; 他曾经发誓打死不买电车&#xff0c; 考虑了三、四年换宝马X5&#xff0c; 结果谈完…