实时渲染必备条件
- 有状态修饰器
- 第一层级数据改变
但@Builder原则上只展示界面,不涉及状态相关,不改变数据
相关组件
@Stata
驱动界面刷新
@Prop
- 单向传值,父传子,只传一次
- 深拷贝,父与子各有一份完全独立的数据(独立内存区域)
@Entry @Component struct Parent{ @State val:number = 0 build(){ Son({val:val}) } } @Component struct Parent{ @Prop val build(){ } }
|
@Link
示例
@Entry @Component struct Parent{ @State val:number = 0 build(){ Son({val:val}) } } @Component struct Parent{ @Link val:number build(){ } }
|
@Provide和@Consume
@eEntry @Component struct Parent{ @Provide val:number = 0 build(){ Son({val:val}) } } @Component struct Parent{ @Consume val:number build(){ } }
|
@Obeserved和@ObjectLink
概述
示例
常规用法
@entry组件:通过将@State修饰的变量a:A,赋值给View组件,即View({a.attr:a.attr})
View组件:通过@ObjectLink attr,观察和修改a的属性attr
@Observer A:有成员a类型为BasicClassA
@Observer BasicClassA:有属性attr
嵌套对象
@Track
属性改变时,只刷新自己的内容。如果不加,则会刷新整个类所有与界面绑定的属性的内容
- 仅在类内使用
- 类中只要有一个属性使用了,其他与界面相关的属性都必须添加
@Watch
$$
持久化与全局变量
Localstorage、Appstorage、PersistenStorage
@LocalStorage
- 在一个Ability内数据共享,局限性大,基本用不上
- 一般只用于服务卡片
###示例
const data: Record<string,string>={ "age": "11" }
Let storage:LocalStorage=new LocalStorage(data)
@Entry(storage) @Component struct Page1 { aboutToAppear(): void { this.age=storage.get("age") as string storage.set("name") } build(){
} }
import {storage} from Page1 @Entry(storage) @Component struct Page2 { aboutToAppear(): void { this.age=storage.get("age") as string } build(){ } }
|
@AppStorage
- AppStorage缓存在应用进程内,应用结束后数据也随之销毁
- AppStorage持久化则可以缓存到磁盘,即@PersistentStorage
AppStorage.setOrCreate("userName","10") AppStorage.get("userName")as string
@StorageProp("name") name:string = ""
@StorageLink("name") name:string = ""
|
@PersistentStorage
用于辅助AppStorage持久化到磁盘
PersistentStorage.persistProp("userName","") @Entry @Component struct AppStoragecase03 { @StorageProp("userName")userName:string="" }
@Component struct PrefrencePage{ store_name="DEFAULT" build(){ Button("持久化缓存数据") .onClick(()=>{ preferences.getPreferences(getContext(this),this.store_name).then((val)=>{ val.putSync("userName",this.message) val.flush() } }) Button("获取持久化的数舞") .onClick(()=>{ preferences.getPreferences(getContext(this),this.store_name) .then((val)=>{ this.result=val.getSync("userName","")as string }) }) } }
|
静态模式
import { preferences }from '@kit.ArkData' import { Context } from '@ohos.arkui.uIcontext' class PreferencesUtil{ static storeName:string ="DEFAULT" static async getPreferenInstance(context:Context, storeName?:string){ let store = storeName != undefined ? storeName : PrefrencesUtil.storeName let preferences = avait preferences.getPreferences(context,store) return preferences } static async putInfo(context: context, key: string, value: string, storeName?:string){ let preferences = await preferencesUtil.getPreferenInstance(context, storeName) preferences.putsync(key,value) await preferences.flush() } }
async aboutToAppear():Promise<void>{ this.result = await PreferencesUtil.getInfo(getContext(this),this.key_name) as string }
|
单例模式
import { preferences }from '@kit.ArkData' import { Context } from '@ohos.arkui.uIcontext' class Prefrencesutils {
private static pre: preferences.ValueType public static getInstances(context:Context){ if (PrefrencesUtils.pre!=undefined ll Prefrencesutils.pre!=null){ return PrefrencesUtils.pre } PrefrencesUtils.pre = preferences.getPreferences(context, "DEFAULT") return PrefrencesUtils.pre } async putInfo(context: Context, key: string, value: string){ let prefrences = await PrefrencesUtils.getInstances(context) prefrences.putsync(key,value) prefrences.flush() } }
|
EventHub