在 HarmonyOS NEXT 中,$r引用返回的是Resource类型对象,而非直接的字符串,因此不能通过简单的+运算符进行拼接。通常有三种主流方案,你可以根据使用场景选择:
🧩 方案一:使用占位符(最推荐,适用于带变量的国际化文案)
这是实现字符串资源拼接最规范的方式,特别适合价格是XX元这类带有动态内容的文本,并且完美支持多语言。
1. 在资源文件 (string.json) 中定义带占位符的模板
json
{ "string": [ { "name": "price_tip", "value": "价格是%d个, 你好%d位, 哈哈哈哈%s" // %d代表数字,%s代表字符串 } ] }2. 在代码中通过$r的第二个参数传入值进行替换
占位符会按照你传入参数的顺序依次填充。
ts
Text($r("app.string.price_tip", 10, 99, "test")) // 最终显示效果为:价格是10个, 你好99位, 哈哈哈哈test🔗 方案二:使用Span组件(适用于在 Text 中组合多个资源)
如果你想在一个Text组件内显示多个不同的字符串资源,可以直接使用Span子组件,这是最优雅的 UI 写法。
ts
Text() { Span($r('app.string.app_name')) Span($r('app.string.module_desc')) }⚙️ 方案三:通过ResourceManager获取字符串再拼接(适用于逻辑代码中)
如果你需要在@Entry组件的业务逻辑中拼接字符串,可以借助ResourceManager将Resource对象转为实际的string。
ts
import common from '@ohos.app.ability.common'; // 1. 获取上下文 let context = getContext(this) as common.UIAbilityContext; // 2. 定义一个转换方法 rs2str(resource: Resource): string { return context.resourceManager.getStringSync(resource.id); } // 3. 在需要的地方拼接 let combinedStr = this.rs2str($r('app.string.xxx')) + this.rs2str($r('app.string.yyy'));⚠️ 特别提醒
部分开发者尝试直接使用$r('app.string.xxx').value获取字符串,虽然这在某些预览版可行,但存在风险,value属性可能返回undefined。为了代码的健壮性和 API 稳定性,强烈建议使用上述方案一或方案三进行规范化处理。