【每日学点鸿蒙知识】箭头函数、Watch状态变量、H5获取定位数据、前后台切换、长按事件
1、HarmonyOS confirm: () => void = () => { }?
confirm: () => void = () => { }是什么格式。
是一个箭头函数,它的类型是 () => void,表示这个函数不接受任何参数,且没有返回值。函数体内没有代码,因为它是一个空函数。在调用这个函数时,它不会执行任何操作,只是简单地返回。
参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/introduction-to-arkts-V5#%E7%AE%AD%E5%A4%B4%E5%87%BD%E6%95%B0%E5%8F%88%E5%90%8Dlambda%E5%87%BD%E6%95%B0
箭头函数(又名Lambda函数),函数可以定义为箭头函数,例如:
let sum = (x: number, y: number): number => {return x + y;
}
箭头函数的返回类型可以省略;省略时,返回类型通过函数体推断。
表达式可以指定为箭头函数,使表达更简短,因此以下两种表达方式是等价的:
let sum1 = (x: number, y: number) => { return x + y; }
let sum2 = (x: number, y: number) => x + y
2、HarmonyOS 关于数组中class更改,List不触发更新问题?
可以参考以下demo,@Watch与@Link组合使用 ,相关文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-watch-V5
class PurchaseItem {static NextId: number = 0;public id: number;public price: number;constructor(price: number) {this.id = PurchaseItem.NextId++;this.price = price;}
}@Component
struct BasketViewer {@Link @Watch('onBasketUpdated') shopBasket: PurchaseItem[];@State totalPurchase: number = 0;updateTotal(): number {let total = this.shopBasket.reduce((sum, i) => sum + i.price, 0);// 超过100欧元可享受折扣if (total >= 100) {total = 0.9 * total;}return total;}// @Watch 回调onBasketUpdated(propName: string): void {this.totalPurchase = this.updateTotal();}build() {Column() {ForEach(this.shopBasket,(item: PurchaseItem) => {Text(`Price: ${item.price.toFixed(2)} €`)},(item: PurchaseItem) => item.id.toString())Text(`Total: ${this.totalPurchase.toFixed(2)} €`)}}
}@Entry
@Component
struct BasketModifier {@State shopBasket: PurchaseItem[] = [];build() {Column() {Button('Add to basket').onClick(() => {this.shopBasket.push(new PurchaseItem(Math.round(100 * Math.random())))})BasketViewer({ shopBasket: $shopBasket })}}
}
@Watch应用于对状态变量的监听。如果开发者需要关注某个状态变量的值是否改变,可以使用@Watch为状态变量设置回调函数。@Watch提供了状态变量的监听能力,@Watch仅能监听到可以观察到的变化。
1、HarmonyOS 通过h5定位getCurrentPosition获取到的定位数据为空对象?
需要在module.json5文件中配置ohos.permission.LOCATION,ohos.permission.APPROXIMATELY_LOCATION权限。
{"name":"ohos.permission.LOCATION","reason":"$string:reason","usedScene":{"abilities": ["FormAbility"],"when":"inuse"}
}
,
{"name":"ohos.permission.APPROXIMATELY_LOCATION","reason":"$string:reason","usedScene":{"abilities": ["FormAbility"],"when":"inuse"}
}
4、HarmonyOS 如何区分页面onPageShow/onPageHide里路由切换时机和前后台切换时机?
希望在后台返回前台时,不做某些操作;在二级页面返回时,做某些操作。现在使用 onPageShow,包含了这两种时机,如何区分这两种时机?
建议使用Navigation来控制路由,Navigation有自己的生命周期,可以在onAppear来处理二级路由返回,onPageShow来处理后台返回前台
5、HarmonyOS 组件有没有长按事件?
有没有长按事件?或者长按事件如何实现
不支持长按事件,支持长按手势。可以通过长按手势实现同样的功能。
参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-gesture-events-single-gesture-V5#%E9%95%BF%E6%8C%89%E6%89%8B%E5%8A%BFlongpressgesture
长按手势用于触发长按手势事件,拥有三个可选参数:
- fingers:用于声明触发长按手势所需要的最少手指数量,最小值为1,最大值为10,默认值为1。
- repeat:用于声明是否连续触发事件回调,默认值为false。
- duration:用于声明触发长按所需的最短时间,单位为毫秒,默认值为500。
以在Text组件上绑定可以重复触发的长按手势为例:
// xxx.ets
@Entry
@Component
struct Index {@State count: number = 0;build() {Column() {Text('LongPress OnAction:' + this.count).fontSize(28).gesture(// 绑定可以重复触发的LongPressGestureLongPressGesture({ repeat: true }).onAction((event: GestureEvent|undefined) => {if(event){if (event.repeat) {this.count++;}}}).onActionEnd(() => {this.count = 0;}))}.height(200).width(250).padding(20).border({ width: 3 }).margin(30)}
}