当前环境: API9、Stage模型
编辑器
模拟器
Win10系统,本地模拟器首次打开(新建)时,在安装Haxm时(点击安装后),显示 模拟器启动失败
找到的解释 自己安装haxm没完成,因为没找到包
解决方案:
核心: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
装饰器,进行绑定:
父组件:
子组件:
12-10 Class类示例中的使用
最近一段时间的模仿案例来看,案例的主要编程思想为工厂模式。
一般处理一个复杂数据,通常都是声明类,然后在类中预设相关的处理,增删改查等。
导出一个New后的类,这样不仅可以在使用的父页数据更新时直接从model中 getData,还可以在子组件内修改值时直接导入New后的类,调用这个model的方法即可,随后又利用@Link
的双向绑定数据重新利用getData进行赋值。
在修改复杂数据内的深层属性时,可能会出现:数据更新,但是视图未更新
的情况。
仅针对Array[object] 类型,目前来看,只通过 调用预设好的修改方法,随后getData 方式是不行的。原因在于ForEach的内的数据修改,需要根据第三个参数的设置进行相应的处理
。
比如ForEach的第三个参数,也就是给定的key设定为当前item内的id,那么如果你要更新这个数据,就得将更新后的item内的id同步更新,这样依赖id更改也就会触发视图更新了。
说到底就是ForEach的视图更新依赖你赋予的key
值。
实践:目标管理案例
Model组
子组件
最后我有想到,如果是接口返回的JSON数据该如何处理?
最后的决定可行的方案就是依旧设定Class类,以上文所述的方式进行,获取到JSON数据之后执行init,赋予相关id,id以随机数生成。随后进行操作即可。
12/11
亦或者,将ForEach内依据的Key指定为 JSON化的item 也可以实现。这样就避免内部额外遍历添加id了。