HarmonyOS开发遇到的一些问题以及思考

66 阅读3分钟

当前环境: API9、Stage模型

编辑器

模拟器

Win10系统,本地模拟器首次打开(新建)时,在安装Haxm时(点击安装后),显示 模拟器启动失败

找到的解释 自己安装haxm没完成,因为没找到包

解决方案:

image.png

核心:BIOS中开启虚拟化

开启方式

注意点: 确认当前CPU支持此功能

代码

Class类 代替 部分Object类型

以前TS的Object[] 数据结构可用,但是数据无法双向绑定

所以这里是可选的,如果是静态类型展示,不需要数据绑定,可以直接用Object[]类型,反之需要使用Class声明内部,且定义装饰器

需要将 Object 替换为 Class类,导出类型中定义 @Observed 装饰器

定义数据结构时需要 new Class

// type/index.ets
@Observed export class FormItem {
  key: String
  icon: Resource
  label: string
  isBlank: boolean
  type: 'input' | 'datePicker' | 'radio' | 'select'
  value: any
  placeholder?: string
  selectList?: any[]

  constructor({key, icon, label, isBlank, type, value, placeholder, selectList}: {
    key: String
    icon: Resource
    label: string
    isBlank: boolean
    type: 'input' | 'datePicker' | 'radio' | 'select'
    value: any
    placeholder?: string
    selectList?: any[]
  }) {
    this.key = key
    this.icon = icon
    this.label = label
    this.isBlank = isBlank
    this.type = type
    this.value = value
    this.placeholder = placeholder
    this.selectList = selectList
  }
}


// 使用 Constant.ets
import { FormItem } from '../types'

export default class Constants {
  static readonly formList: FormItem[] = [
    new FormItem({
      label: '昵称',
      icon: $r('app.media.user2'),
      isBlank: false,
      type: 'input',
      value: '',
      placeholder: '昵称',
      key: 'nick'
    }),
    new FormItem({
      label: '性别',
      icon: $r('app.media.sex'),
      isBlank: true,
      type: 'radio',
      value: '0',
      key: 'sex',
      selectList: [
        {
          label: '男',
          value: '1'
        },
        {
          label: '女',
          value: '0'
        }]
    }),
  ]
}


最后使用时,需要在Item中定义 @ObjectLink 装饰器,进行绑定:

父组件:

image.png

子组件: image.png

12-10 Class类示例中的使用

最近一段时间的模仿案例来看,案例的主要编程思想为工厂模式。

一般处理一个复杂数据,通常都是声明类,然后在类中预设相关的处理,增删改查等。

导出一个New后的类,这样不仅可以在使用的父页数据更新时直接从model中 getData,还可以在子组件内修改值时直接导入New后的类,调用这个model的方法即可,随后又利用@Link的双向绑定数据重新利用getData进行赋值。

在修改复杂数据内的深层属性时,可能会出现:数据更新,但是视图未更新的情况。

仅针对Array[object] 类型,目前来看,只通过 调用预设好的修改方法,随后getData 方式是不行的。原因在于ForEach的内的数据修改,需要根据第三个参数的设置进行相应的处理

比如ForEach的第三个参数,也就是给定的key设定为当前item内的id,那么如果你要更新这个数据,就得将更新后的item内的id同步更新,这样依赖id更改也就会触发视图更新了。

说到底就是ForEach的视图更新依赖你赋予的key值。

参考

实践:目标管理案例

Model组

image.png

子组件 image.png

最后我有想到,如果是接口返回的JSON数据该如何处理?

最后的决定可行的方案就是依旧设定Class类,以上文所述的方式进行,获取到JSON数据之后执行init,赋予相关id,id以随机数生成。随后进行操作即可。

12/11

亦或者,将ForEach内依据的Key指定为 JSON化的item 也可以实现。这样就避免内部额外遍历添加id了。