1# 开发语言常见问题 2 3## TS语言在生成器函数中编译失败,有哪些使用限制 4 5适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 6 7TS语言的使用在生成器函数中存在以下限制: 8 9- 表达式仅允许在字符串(${expression})、if条件、ForEach的参数和组件的参数中使用; 10 11- 这些表达式中的任何一个都不能导致任何应用程序状态变量(\@State、\@Link、\@Prop)的改变,否则会导致未定义和潜在不稳定的框架行为; 12 13- 生成器函数内部不能有局部变量。 14 15上述限制都不适用于事件处理函数(例如onClick)的匿名函数实现。 16 17错误示例: 18 19 20``` 21build() { 22 let a: number = 1 // invalid: variable declaration not allowed 23 Column() { 24 Text('Hello ${this.myName.toUpperCase()}') // ok. 25 ForEach(this.arr.reverse(), ..., ...) // invalid: Array.reverse modifies the @State array variable in place 26 } 27 buildSpecial() // invalid: no function calls 28 Text(this.calcTextValue()) // this function call is ok. 29} 30``` 31 32## 如何动态替换掉资源文件中的“%s”占位符 33 34适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 35 36在应用中,通过"$r('app.string.xx')"的形式引用应用资源,$r的第二个参数可用于替换%s占位符。 37 38 示例: 39 40``` 41build() { 42 //do something 43 //引用的string资源,$r的第二个参数用于替换%s 44 Text($r('app.string.entry_desc','aaa')) 45 .fontSize(100) 46 .fontColor(Color.Black) 47 //do something 48} 49``` 50 51## 如何读取Resource中的xml文件并转化为String类型 52 53适用于:OpenHarmony SDK 3.2.2.5版本, API9 Stage模型 54 551. 通过resourceManager的RawFile接口获取Uint8Array格式数据。 56 572. 通过String.fromCharCode将Uint8Array格式数据转化为String类型。快快快 58 59参考文档:[资源管理](../reference/apis/js-apis-resource-manager.md) 60 61示例: 62 63 64``` 65resourceManager.getRawFile(path, (error, value) => { 66 if (error != null) { 67 console.log("error is " + error); 68 } else { 69 let rawFile = value; 70 let xml = String.fromCharCode.apply(null, rawFile) 71 } 72}); 73``` 74 75## 如何将Resource资源对象转成string类型 76 77适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型 78 79通过\@ohos.resourceManager模块 resourceManager.getString()方法获取字符串。 80 81参考文档:[资源管理](../reference/apis/js-apis-resource-manager.md#getstring) 82 83## class全局静态变量无法使用的问题 84 85适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型 86 87Page和Ability打包后会对import的对象分别形成两个不同的闭包,即打包出两个Global对象。因此,所引用的静态变量并不是同一对象,所以无法通过class静态变量方式定义全局变量。建议使用AppStorage进行全局变量管理。 88 89参考文档:[应用程序的数据存储](../quick-start/arkts-state-mgmt-application-level.md) 90 91## Stage模型下如何获取资源 92 93适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型 94 95Stage模型支持了通过context获取resourceManager对象的方式,再调用其内部获取资源的接口,无需再导入包,此方式FA模型不适用。 96 97示例: 98 99 100``` 101const context = getContext(this) as any 102context 103 .resourceManager 104 .getString($r('app.string.entry_desc').id) 105 .then(value => { 106 this.message = value.toString() 107}) 108``` 109 110## 如何实现页面加载前从接口获取数据 111 112适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 113 114aboutToAppear函数中使用异步接口获取页面数据,使用\@State修饰变量,数据获取完成后根据变量自动刷新页面。 115 116 117``` 118@Entry 119@Component 120struct Test6Page { 121 // 数据获取成功,会自动刷新页面 122 @State message: string = 'loading.....' 123 aboutToAppear(){ 124 // 模拟异步接口获取数据 125 setTimeout(()=>{ 126 this.message = 'new msg' 127 },3000) 128 } 129 build() { 130 Row() { 131 Column() { 132 Text(this.message) 133 .fontSize(50) 134 .fontWeight(FontWeight.Bold) 135 } 136 .width('100%') 137 } 138 .height('100%') 139 } 140} 141``` 142 143## worker线程与主线程是否运行在相同的全局上下文中 144 145适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 146 147worker线程与主线程不在同一个上下文中,它们使用数据通信的方式交互。 148 149## OpenHarmony上url编码使用哪个接口 150 151适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 152 153使用全局函数encodeURI进行编码,使用decodeURI进行解码。例如空格字符,编码后为%20。 154 155## OpenHarmony有解析xml的接口吗 156 157适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 158 159使用ConvertXML的convert接口可以将xml文本解析为JavaScript对象。参考文档:[convertxml API文档](../reference/apis/js-apis-convertxml.md) 160 161## 应用图标一多设置 162 163适用于:OpenHarmony SDK3.0, API9 Stage模型 164 165借助资源限定词能力,实现应用图标的一多配置,具体使用参考[资源使用](../key-features/multi-device-app-dev/resource-usage.md) 166 167## Stage模型资源配置文件string.json文件中支持配置占位符吗 168 169适用于:OpenHarmony SDK3.2.6.3, API9 Stage模型 170 171资源配置文件string.json文件本身不支持配置占位符,可以在对应的页面中通过定义变量,在实际组件使用Resources和变量拼接的方式达到实现占位符的同等效果。 172 173## OpenHarmony的systemTime.getCurrentTime()接口和JS的new Date().getTime()有区别吗 174 175适用于:OpenHarmony SDK3.2.6.3, API9 Stage模型 176 177systemTime.getCurrentTime(false)和new Date().getTime()一样,都是返回1970年1月1日至今的毫秒数;systemTime.getCurrentTime(true)返回1970年1月1日至今的纳秒数。两种方式都是系统时间。 178 179## \@BuilderParam装饰器,组件传参问题 180 181适用于:OpenHarmony SDK3.2.6.5, API9 Stage模型 182 183对\@BuilderParam修饰的属性进行赋值时不带参数(如:content: this.specificParam),则此属性的类型需定义成无返回值的函数(如:\@BuilderParam content: () => void);若带参数(如:callContent: this.specificParam1("111")),则此属性的类型需定义成any(如:\@BuilderParam callContent: any;),具体用法请参考[BuilderParam](../quick-start/arkts-dynamic-ui-elememt-building.md#builderparam8)。 184 185## ArkTS如何把string转成byte数组 186 187适用于:所有版本 188 189参考如下代码实现,示例: 190 191 192``` 193function stringToByte(str) { 194 var bytes = new Array(); 195 var len,c; 196 len = str.length; 197 for(var i = 0;i<len;i++) { 198 c = str.charCodeAt(i); 199 if( c >= 0x010000 && c<= 0x10FFFF) { 200 bytes.push(((c>>18) & 0x07) | 0xf0); 201 bytes.push(((c>>12) & 0x3F) | 0x80); 202 bytes.push(((c>>6) & 0x3f) | 0x80); 203 bytes.push((c & 0x3F) | 0x80); 204 } else if(c >= 0x000800 && c<= 0x00FFF){ 205 bytes.push(((c>>12) & 0x07) | 0xf0); 206 bytes.push(((c>>6) & 0x3F) | 0x80); 207 bytes.push((c & 0x3F) | 0x80); 208 } else if(c >= 0x000800 && c<= 0x0007FF) { 209 bytes.push(((c>>6) & 0x3F) | 0x80); 210 bytes.push((c & 0x3F) | 0x80); 211 } else { 212 bytes.push(c & 0xFF) 213 } 214 } 215 return bytes; 216} 217``` 218 219## 创建woker时报错“Too many wokers,the number of worker exceeds the maximum”如何处理 220 221使用于:OpenHarmony SDK 3.2.6.5版本 222 223这是因为每个应用的worker上限为7个,因此在worker使用完成后需要通过termiate方法释放worker。参考[worker开发指南](../reference/apis/js-apis-worker.md#terminate)。 224 225## OpenHarmony推荐的多线程解决方案是什么 226 227使用于:OpenHarmony SDK 3.2.6.5版本 API9 Stage模型 228 229OpenHarmony推荐使用worker来处理多线程场景。 230 231参考文档:[启动一个worker](../reference/apis/js-apis-worker.md) 232 233## 使用\@Builder装饰包含自定义组件的方法与普通方法的区别是什么 234 235适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 236 237\@Builder装饰的方法中使用了自定义组件,那么该方法每次被调用时,对应的自定义组件均会重新创建。 238 239## 状态管理中\@Watch监听,数组内对象属性变化无法触发watch回调函数 240 241适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 242 243使用\@Watch监听的对象,只能监听一层数据变化,多层次数据变更无法监听,同\@State状态管理机制一致 244 245## 如何监听\@State深层数据变化 246 247适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 248 249通过\@Observed配合\@ObjectLink装饰符实现。 250 251参考文档:[Observed和ObjectLink数据管理](../quick-start/arkts-state-mgmt-page-level.md#observed和objectlink数据管理) 252 253## 如何实现字符串编解码 254 255适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 256 257通过util工具函数模块中的TextEncoder和TextDecoder进行解码。 258 259参考文档:[TextEncoder](../reference/apis/js-apis-util.md#textencoder)、[TextDecoder](../reference/apis/js-apis-util.md#textdecoder) 260 261## 如何导入和导出namespace命名空间 262 263适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 264 265- namespace导出 266 267 ``` 268 namespace Util{ 269 export function getTime(){ 270 return Date.now() 271 } 272 } 273 export default Util 274 ``` 275 276- namespace导入 277 278 ``` 279 import Util from './util' 280 Util.getTime() 281 ``` 282 283## worker线程中能进行关系型数据库的操作吗 284 285适用于:OpenHarmony SDK 3.2.5.5版本, API9 Stage模型 286 287不支持。 288