# getTarget接å£ï¼šèŽ·å–状æ€ç®¡ç†æ¡†æž¶ä»£ç†å‰çš„原始对象 为了获å–状æ€ç®¡ç†æ¡†æž¶ä»£ç†å‰çš„原始对象,开å‘者å¯ä»¥ä½¿ç”¨[getTarget接å£](../reference/apis-arkui/js-apis-StateManagement.md#gettarget)。 在阅读本文档å‰ï¼Œå»ºè®®æå‰é˜…读:[\@Observed](./arkts-observed-and-objectlink.md),[\@ObservedV2](./arkts-new-observedV2-and-trace.md)。 >**说明:** > >从API version 12开始,开å‘者å¯ä»¥ä½¿ç”¨UIUtilsä¸çš„getTarget接å£èŽ·å–状æ€ç®¡ç†æ¡†æž¶ä»£ç†å‰çš„原始对象。 ## 概述 状æ€ç®¡ç†æ¡†æž¶ä¼šå¯¹Classã€Dateã€Mapã€Setã€Arrayç±»åž‹çš„åŽŸå§‹å¯¹è±¡æ·»åŠ ä»£ç†ï¼Œç”¨äºŽè§‚测属性å˜åŒ–与API调用。这一层代ç†ä¼šä½¿å¾—å˜é‡ç±»åž‹æ”¹å˜ï¼Œåœ¨ç±»åž‹åˆ¤æ–ã€NAPI调用ç‰åœºæ™¯ï¼Œä¼šç”±äºŽç±»åž‹å¹¶éžåŽŸå§‹å¯¹è±¡çš„ç±»åž‹äº§ç”Ÿé¢„æ–™ä¹‹å¤–çš„ç»“æžœã€‚ - 使用getTarget接å£éœ€è¦å¯¼å…¥UIUtils工具。 ```ts import { UIUtils } from '@kit.ArkUI'; ``` - 状æ€ç®¡ç†V1ä¸ï¼Œä¼šç»™\@Observed装饰的类对象以åŠä½¿ç”¨çжæ€å˜é‡è£…饰器如\@State装饰的Classã€Dateã€Mapã€Setã€Arrayæ·»åŠ ä¸€å±‚ä»£ç†ç”¨äºŽè§‚测一层属性或API调用产生的å˜åŒ–。 - 状æ€ç®¡ç†V2ä¸ï¼Œä¼šç»™ä½¿ç”¨çжæ€å˜é‡è£…饰器如\@Traceã€\@Local装饰的Dateã€Mapã€Setã€Arrayæ·»åŠ ä¸€å±‚ä»£ç†ç”¨äºŽè§‚测API调用产生的å˜åŒ–。 使用getTarget接å£å¯ä»¥èŽ·å–这些代ç†å¯¹è±¡çš„原始对象。 ## é™åˆ¶æ¡ä»¶ - getTarget仅支æŒå¯¹è±¡ç±»åž‹ä¼ å‚ ```ts import { UIUtils } from '@kit.ArkUI'; let res = UIUtils.getTarget(2); // éžå¯¹è±¡ç±»åž‹å…¥å‚,错误用法 @Observed class Info { name: string = "Tom"; } let info: Info = new Info(); let rawInfo: Info = UIUtils.getTarget(info); // æ£ç¡®ç”¨æ³• ``` - 更改getTarget获å–的原始对象ä¸çš„内容ä¸ä¼šè¢«è§‚察到å˜åŒ–,也ä¸ä¼šè§¦å‘UI刷新。 ```ts import { UIUtils } from '@kit.ArkUI'; @Observed class Info { name: string = "Tom"; } @Entry @Component struct Index { @State info: Info = new Info(); build() { Column() { Text(`info.name: ${this.info.name}`) Button(`更改代ç†å¯¹è±¡çš„属性`) .onClick(() => { this.info.name = "Alice"; // Text组件能够刷新 }) Button(`更改原始对象的属性`) .onClick(() => { let rawInfo: Info = UIUtils.getTarget(this.info); rawInfo.name = "Bob"; // Text组件ä¸èƒ½åˆ·æ–° }) } } } ``` ## 使用场景 ### 获å–状æ€ç®¡ç†V1代ç†å‰çš„原始对象 状æ€ç®¡ç†V1有两ç§åœºæ™¯ä¼šç»™å¯¹è±¡å¢žåР代ç†ï¼š ã€1】\@Observed装饰的类实例。在创建\@Observedè£…é¥°çš„ç±»å®žä¾‹æ—¶ï¼Œä¼šç»™è¯¥å®žä¾‹æ·»åŠ ä»£ç†ã€‚该过程å‘生在new对象的过程ä¸ï¼Œæ²¡æœ‰ç»è¿‡newæ“作符创建的对象是ä¸è¢«ä»£ç†çš„。 ```ts @Observed class ObservedClass { name: string = "Tom"; } class NonObservedClass { name: string = "Tom"; } let observedClass: ObservedClass = new ObservedClass(); // è¢«ä»£ç† let nonObservedClass: NonObservedClass = new NonObservedClass(); // ä¸è¢«ä»£ç† ``` ã€2】状æ€å˜é‡è£…é¥°å™¨è£…é¥°çš„å¤æ‚类型对象。使用\@Stateã€\@Propç‰çжæ€å˜é‡è£…饰器装饰Classã€Mapã€Setã€Dateã€Arrayæ—¶ï¼Œä¼šæ·»åŠ ä»£ç†ã€‚è‹¥è¯¥å¯¹è±¡å·²ç»æ˜¯ä»£ç†å¯¹è±¡ï¼Œåˆ™ä¸ä¼šé‡å¤åˆ›å»ºä»£ç†ã€‚ ```ts @Observed class ObservedClass { name: string = "Tom"; } class NonObservedClass { name: string = "Tom"; } let observedClass: ObservedClass = new ObservedClass(); // è¢«ä»£ç† let nonObservedClass: NonObservedClass = new NonObservedClass(); // ä¸è¢«ä»£ç† @Entry @Component struct Index { @State observedObject: ObservedClass = observedClass; // å·²è¢«ä»£ç†æ•°æ®ä¸ä¼šé‡å¤åˆ›å»ºä»£ç† @State nonObservedObject: NonObservedClass = nonObservedClass; // åˆ›å»ºä»£ç† @State numberList: number[] = [1, 2, 3]; // Arrayç±»åž‹åˆ›å»ºä»£ç† @State sampleMap: Map<number, string> = new Map([[0, "a"], [1, "b"], [3, "c"]]); // Mapç±»åž‹åˆ›å»ºä»£ç† @State sampleSet: Set<number> = new Set([0, 1, 2, 3, 4]); // Setç±»åž‹åˆ›å»ºä»£ç† @State sampleDate: Date = new Date(); // Dateç±»åž‹åˆ›å»ºä»£ç† build() { Column() { Text(`this.observedObject === observedClass: ${this.observedObject === observedClass}`) // true Text(`this.nonObservedObject === nonObservedClass: ${this.nonObservedObject === nonObservedClass}`) // false } } } ``` 使用UIUtils.getTarget接å£å¯ä»¥èŽ·å–代ç†å‰çš„原始对象。 ```ts import { UIUtils } from '@kit.ArkUI'; @Observed class ObservedClass { name: string = "Tom"; } class NonObservedClass { name: string = "Tom"; } let observedClass: ObservedClass = new ObservedClass(); // è¢«ä»£ç† let nonObservedClass: NonObservedClass = new NonObservedClass(); // ä¸è¢«ä»£ç† let globalNumberList: number[] = [1, 2, 3]; // ä¸è¢«ä»£ç† let globalSampleMap: Map<number, string> = new Map([[0, "a"], [1, "b"], [3, "c"]]); // ä¸è¢«ä»£ç† let globalSampleSet: Set<number> = new Set([0, 1, 2, 3, 4]); // ä¸è¢«ä»£ç† let globalSampleDate: Date = new Date(); // ä¸è¢«ä»£ç† @Entry @Component struct Index { @State observedObject: ObservedClass = observedClass; // å·²è¢«ä»£ç†æ•°æ®ä¸ä¼šé‡å¤åˆ›å»ºä»£ç† @State nonObservedObject: NonObservedClass = nonObservedClass; // åˆ›å»ºä»£ç† @State numberList: number[] = globalNumberList; // Arrayç±»åž‹åˆ›å»ºä»£ç† @State sampleMap: Map<number, string> = globalSampleMap; // Mapç±»åž‹åˆ›å»ºä»£ç† @State sampleSet: Set<number> = globalSampleSet; // Setç±»åž‹åˆ›å»ºä»£ç† @State sampleDate: Date = globalSampleDate; // Dateç±»åž‹åˆ›å»ºä»£ç† build() { Column() { Text(`this.observedObject === observedClass: ${this.observedObject === observedClass}`) // true Text(`UIUtils.getTarget(this.nonObservedObject) === nonObservedClass: ${UIUtils.getTarget(this.nonObservedObject) === nonObservedClass}`) // true Text(`UIUtils.getTarget(this.numberList) === globalNumberList: ${UIUtils.getTarget(this.numberList) === globalNumberList}`) // true Text(`UIUtils.getTarget(this.sampleMap) === globalSampleMap: ${UIUtils.getTarget(this.sampleMap) === globalSampleMap}`) // true Text(`UIUtils.getTarget(this.sampleSet) === globalSampleSet: ${UIUtils.getTarget(this.sampleSet) === globalSampleSet}`) // true Text(`UIUtils.getTarget(this.sampleDate) === globalSampleDate: ${UIUtils.getTarget(this.sampleDate) === globalSampleDate}`) // true } } } ``` ### 获å–状æ€ç®¡ç†V2代ç†å‰çš„原始对象 状æ€ç®¡ç†V2会给状æ€å˜é‡è£…饰器如\@Traceã€\@Local装饰的Mapã€Setã€Dateã€Arrayæ·»åŠ ä¸€å±‚ä»£ç†ã€‚å’ŒV1ä¸åŒçš„æ˜¯ï¼Œçжæ€ç®¡ç†V2ä¸ä¼šå¯¹ç±»å¯¹è±¡å®žä¾‹è¿›è¡Œä»£ç†ã€‚ ```ts @ObservedV2 class ObservedClass { @Trace name: string = "Tom"; } let globalObservedObject: ObservedClass = new ObservedClass(); // ä¸è¢«ä»£ç† let globalNumberList: number[] = [1, 2, 3]; // ä¸è¢«ä»£ç† let globalSampleMap: Map<number, string> = new Map([[0, "a"], [1, "b"], [3, "c"]]); // ä¸è¢«ä»£ç† let globalSampleSet: Set<number> = new Set([0, 1, 2, 3, 4]); // ä¸è¢«ä»£ç† let globalSampleDate: Date = new Date(); // ä¸è¢«ä»£ç† @Entry @ComponentV2 struct Index { @Local observedObject: ObservedClass = globalObservedObject; // V2ä¸å¯¹è±¡ä¸è¢«ä»£ç† @Local numberList: number[] = globalNumberList; // Arrayç±»åž‹åˆ›å»ºä»£ç† @Local sampleMap: Map<number, string> = globalSampleMap; // Mapç±»åž‹åˆ›å»ºä»£ç† @Local sampleSet: Set<number> = globalSampleSet; // Setç±»åž‹åˆ›å»ºä»£ç† @Local sampleDate: Date = globalSampleDate; // Dateç±»åž‹åˆ›å»ºä»£ç† build() { Column() { Text(`this.observedObject === globalObservedObject ${this.observedObject === globalObservedObject}`) // true Text(`this.numberList === globalNumberList ${this.numberList === globalNumberList}`) // false } } } ``` 使用UIUtils.getTarget接å£å¯ä»¥èŽ·å–代ç†å‰çš„原始对象。 ```ts import { UIUtils } from '@kit.ArkUI'; @ObservedV2 class ObservedClass { @Trace name: string = "Tom"; } let globalObservedObject: ObservedClass = new ObservedClass(); // ä¸è¢«ä»£ç† let globalNumberList: number[] = [1, 2, 3]; // ä¸è¢«ä»£ç† let globalSampleMap: Map<number, string> = new Map([[0, "a"], [1, "b"], [3, "c"]]); // ä¸è¢«ä»£ç† let globalSampleSet: Set<number> = new Set([0, 1, 2, 3, 4]); // ä¸è¢«ä»£ç† let globalSampleDate: Date = new Date(); // ä¸è¢«ä»£ç† @Entry @ComponentV2 struct Index { @Local observedObject: ObservedClass = globalObservedObject; // V2ä¸å¯¹è±¡ä¸è¢«ä»£ç† @Local numberList: number[] = globalNumberList; // Arrayç±»åž‹åˆ›å»ºä»£ç† @Local sampleMap: Map<number, string> = globalSampleMap; // Mapç±»åž‹åˆ›å»ºä»£ç† @Local sampleSet: Set<number> = globalSampleSet; // Setç±»åž‹åˆ›å»ºä»£ç† @Local sampleDate: Date = globalSampleDate; // Dateç±»åž‹åˆ›å»ºä»£ç† build() { Column() { Text(`this.observedObject === globalObservedObject ${this.observedObject === globalObservedObject}`) // true Text(`UIUtils.getTarget(this.numberList) === globalNumberList: ${UIUtils.getTarget(this.numberList) === globalNumberList}`) // true Text(`UIUtils.getTarget(this.sampleMap) === globalSampleMAP: ${UIUtils.getTarget(this.sampleMap) === globalSampleMap}`) // true Text(`UIUtils.getTarget(this.sampleSet) === globalSampleSet: ${UIUtils.getTarget(this.sampleSet) === globalSampleSet}`) // true Text(`UIUtils.getTarget(this.sampleDate) === globalSampleDate: ${UIUtils.getTarget(this.sampleDate) === globalSampleDate}`) // true } } } ``` 状æ€ç®¡ç†V2装饰器会为装饰的å˜é‡ç”Ÿæˆgetterå’Œsetteræ–¹æ³•ï¼ŒåŒæ—¶ä¸ºåŽŸæœ‰å˜é‡åæ·»åŠ "\_\_ob\_"çš„å‰ç¼€ã€‚出于性能考虑,getTarget接å£ä¸ä¼šå¯¹V2装饰器生æˆçš„å‰ç¼€è¿›è¡Œå¤„ç†ï¼Œå› æ¤å‘getTarget接å£ä¼ å…¥\@ObservedV2è£…é¥°çš„ç±»å¯¹è±¡å®žä¾‹æ—¶ï¼Œè¿”å›žçš„å¯¹è±¡ä¾æ—§ä¸ºå¯¹è±¡æœ¬èº«ï¼Œä¸”被\@Trace装饰的属性å仿œ‰"\_\_ob\_"å‰ç¼€ã€‚ 该å‰ç¼€ä¼šå¯¼è‡´æŸäº›NAPIæŽ¥å£æ— 法按预期处ç†å¯¹è±¡çš„属性,以下é¢çš„对象为例,目å‰å·²çŸ¥å½±å“çš„NAPI接å£å¦‚下: ```ts // ObservedV2装饰的类 @ObservedV2 class Info { @Trace name: string = "Tom"; @Trace age: number = 24; } let info: Info = new Info(); // NAPI接å£ä¼ å…¥info实例 ``` | 影哿ޥå£å | å½±å“结果 | | ----------------------- | ---------------------------------------------- | | napi_get_property_names | 返回值为"\_\_ob\_name","\_\_ob\_age"。 | | napi_set_property | 使用"name","\_\_ob\_name"å‡èƒ½èµ‹å€¼æˆåŠŸã€‚ | | napi_get_property | 使用"name","\_\_ob\_name"å‡èƒ½èŽ·å–到值。 | | napi_has_property | 使用"name","\_\_ob\_name"å‡è¿”回true。 | | napi_delete_property | åˆ é™¤å±žæ€§æ—¶éœ€è¦åŠ ä¸Š"\_\_ob\_"å‰ç¼€æ‰èƒ½åˆ 除æˆåŠŸã€‚ | | napi_has_own_property | 使用"name","\_\_ob\_name"å‡è¿”回true。 | | napi_set_named_property | 使用"name","\_\_ob\_name"å‡èƒ½èµ‹å€¼æˆåŠŸã€‚ | | napi_get_named_property | 使用"name","\_\_ob\_name"å‡èƒ½èŽ·å–到值。 | | napi_has_named_property | 使用"name","\_\_ob\_name"å‡è¿”回true。 |