实时渲染必备条件

  1. 有状态修饰器
  2. 第一层级数据改变
    但@Builder原则上只展示界面,不涉及状态相关,不改变数据

相关组件

@Stata

驱动界面刷新

@Prop

  • 单向传值,父传子,只传一次
  • 深拷贝,父与子各有一份完全独立的数据(独立内存区域)
@Entry
@Component
struct Parent{
@State val:number = 0
build(){
Son({val:val})
}
}
@Component
struct Parent{
@Prop val
build(){

}
}
  • 双向传值
  • 浅拷贝,父与子共用一份数据

示例

@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(){

}
}

概述

  • @ObjectLink不能在@entry内

示例

常规用法

@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内数据共享,局限性大,基本用不上
  • 一般只用于服务卡片
    ###示例
//Page1————————————————————————————
const data: Record<string,string>={
"age": "11"
}
//创建对象
Let storage:LocalStorage=new LocalStorage(data)
//将storage注入到页面里面
@Entry(storage)
@Component
struct Page1 {
aboutToAppear(): void {
this.age=storage.get("age") as string
storage.set("name")
}
build(){

}
}
//Page2————————————————————————————
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
//单向传值,不会写回AppStorage中,即父(storage)传子
@StorageProp("name") name:string = ""
//双向传值,会写回AppStorage中
@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(()=>{
//参数:context,仓库名称
//context:上下文参数 Ability Application
//仓库名称
preferences.getPreferences(getContext(this),this.store_name).then((val)=>{
//val是prefrences首选项对象
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"
//async代表该函数异步
//await与async同时出现
//获取仓库
static async getPreferenInstance(context:Context, storeName?:string){
let store = storeName != undefined ? storeName : PrefrencesUtil.storeName
//await 等待这个函数执行完毕 拿到结果
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){
//保证程序里面只有一个preferences 对象
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