从入门小白到精通,玩转 React Native 鸿蒙跨平台开发:Text 文本显示组件实战
组件的封装,鸿蒙原生 Text 本身支持「文本分段样式」,RN 保留了这个特性,嵌套的 Text 会继承父 Text 的样式,也可自定义样式覆盖,从而实现富文本效果。✅ 开发技巧:富文本是 App 开发的刚需(比如协议文本的高亮、关键词标色),掌握 Text 嵌套即可轻松实现,无需引入第三方富文本库,鸿蒙环境无兼容问题。如果文本内容是固定不变的(比如标题、提示语),无需绑定动态变量,直接写死字符串
目录
1.2 React Native Text 核心特性(鸿蒙适配版)
二、Text 组件 核心属性 & 样式全解析(鸿蒙适配版,表格汇总,必背)
2.1 Text 专属核心属性(表格,最常用高频属性,优先级最高)
2.2 Text 核心样式属性(表格,文本样式全覆盖,与 View 区分记忆)
✅ 优化 2:使用 StyleSheet.create 统一管理样式(本文已实现)
✅ 优化 4:鸿蒙专属优化 - 关闭文本缩放(固定字体大小)
一、基础认知:Text 文本组件核心定位
1.1 组件核心价值
Text 是 React Native 鸿蒙跨平台开发中最核心的文本展示基础组件,也是继 View 之后必须精通的高频组件,专门用于渲染和展示字符串文本内容,是承载 App 中所有文字类信息的核心载体。
- 基础能力:展示普通文本、数字、符号等字符串内容
- 核心特性:支持文本样式定制、多行展示、文本截断、长按选中、嵌套富文本、事件响应
- 鸿蒙适配:
RN 的 Text底层封装鸿蒙原生的Text组件,完美兼容鸿蒙的 dp 单位、字体库、文本排版规则
1.2 React Native Text 核心特性(鸿蒙适配版)
- 鸿蒙优先适配:文本尺寸默认
dp单位,自动做鸿蒙屏幕的分辨率适配 - 文本嵌套特性:RN 中只有 Text 组件可以嵌套 Text 组件,实现「富文本」效果,鸿蒙原生完美兼容该特性
- 鸿蒙专属优化:支持鸿蒙系统的原生字体、文本描边、文本阴影等高阶样式
- 事件互通:RN 的文本点击 / 长按事件,桥接为鸿蒙原生的
ClickEvent/LongPressEvent - 无障碍适配:对接鸿蒙无障碍服务,支持屏幕朗读、文本焦点适配
二、Text 组件 核心属性 & 样式全解析(鸿蒙适配版,表格汇总,必背)
2.1 Text 专属核心属性(表格,最常用高频属性,优先级最高)
| 属性名 | 类型 | 核心作用 | 实用示例 |
|---|---|---|---|
children |
string/Text 组件 | 文本内容 / 嵌套子 Text | <Text>鸿蒙跨平台文本</Text> |
numberOfLines |
number | 限制文本最大展示行数 | numberOfLines={2} |
ellipsizeMode |
string | 文本超行时的省略策略 | ellipsizeMode="tail" |
selectable |
boolean | 是否允许长按选中文本 | selectable={true} |
adjustsFontSizeToFit |
boolean | 自动缩放字体适配容器宽度 | adjustsFontSizeToFit={true} |
minimumFontScale |
number | 字体缩放最小比例 | minimumFontScale={0.6} |
allowFontScaling |
boolean | 是否跟随系统字体大小缩放 | allowFontScaling={false} |
onPress |
()=>void | 文本点击事件 | onPress={()=>console.log('文本被点击')} |
onLongPress |
()=>void | 文本长按事件 | onLongPress={()=>console.log('文本被长按')} |
2.2 Text 核心样式属性(表格,文本样式全覆盖,与 View 区分记忆)
Text 组件继承 View 的所有基础样式(宽高、边距、内边距、背景色等),以下为Text 专属 / 高频文本样式,也是开发中使用最多的样式,务必掌握:
| 样式名 | 类型 | 作用 | 鸿蒙适配注意事项 | 示例 |
|---|---|---|---|---|
fontSize |
number | 字体大小 | ✅ 单位默认 dp,鸿蒙自动适配 | fontSize:16 |
fontWeight |
string/number | 字体粗细 | ✅ 支持 bold/normal/500/700 等 | fontWeight:'600' |
fontFamily |
string | 自定义字体 | ✅ 推荐鸿蒙原生「思源黑体」 | fontFamily:'HarmonyOS Sans' |
color |
string | 文本颜色 | ✅ 支持十六进制 /rgb/rgba | color:'#333333' |
textAlign |
string | 文本对齐方式 | ✅ 支持 left/center/right/justify | textAlign:'center' |
lineHeight |
number | 文本行高 | ✅ 单位 dp,鸿蒙完美适配 | lineHeight:24 |
textDecorationLine |
string | 文本装饰线 | ✅ 支持 underline/line-through/none | textDecorationLine:'underline' |
textDecorationColor |
string | 装饰线颜色 | ✅ 配合上样式使用 | textDecorationColor:'#999' |
letterSpacing |
number | 字符间距 | ✅ 单位 dp,鸿蒙 API9 + 支持 | letterSpacing:2 |
textShadowColor |
string | 文本阴影颜色 | ✅ 鸿蒙专属优化渲染 | textShadowColor:'#000' |
textShadowOffset |
{width,height} | 阴影偏移 | ✅ 无兼容问题 | textShadowOffset:{width:1,height:1} |
opacity |
number | 文本透明度 | ✅ 0-1 取值,与 View 一致 | opacity:0.8 |
三、一站式完整可运行实战代码
import React from 'react';
import { View, Text, StyleSheet, ScrollView } from 'react-native';
const TextComponentAllInOne = () => {
// 文本点击事件统一封装
const handleTextClick = (textName) => {
console.log(`【${textName}】被点击 - 鸿蒙环境日志输出`);
};
return (
<ScrollView style={styles.pageContainer}>
{/* ============== 模块1:基础文本展示 ============== */}
<View style={styles.moduleBox}>
<Text style={styles.moduleTitle}>模块1:基础文本 · 原生展示</Text>
<Text style={styles.textBasic}>鸿蒙跨平台基础文本展示</Text>
<Text style={styles.textBasic}>React Native + OpenHarmony 一站式开发</Text>
</View>
{/* ============== 模块2:文本基础样式定制 ============== */}
<View style={styles.moduleBox}>
<Text style={styles.moduleTitle}>模块2:文本样式定制 · 字体/颜色/粗细</Text>
<Text style={styles.textStyle1}>字体18号 + 黑色 + 加粗600</Text>
<Text style={styles.textStyle2}>字体14号 + 灰色 + 正常粗细 + 居中对齐</Text>
<Text style={styles.textStyle3}>字体16号 + 蓝色 + 下划线装饰</Text>
<Text style={styles.textStyle4}>删除线文本 · 灰色 + 中划线</Text>
</View>
{/* ============== 模块3:多行文本&省略截断 ============== */}
<View style={styles.moduleBox}>
<Text style={styles.moduleTitle}>模块3:多行文本 · 行数限制+省略策略</Text>
<Text style={styles.textMultiLine} numberOfLines={2} ellipsizeMode="tail">
这是一段超长的测试文本,用于演示文本超出指定行数后的省略效果,尾部省略是开发中最常用的方式,鸿蒙环境完美兼容该特性
</Text>
<Text style={styles.textMultiLine} numberOfLines={2} ellipsizeMode="middle" style={{marginTop:10}}>
这是一段超长的测试文本,用于演示文本超出指定行数后的省略效果,中间省略适合长文本内容展示
</Text>
</View>
{/* ============== 模块4:鸿蒙专属文本优化 · 行高/间距/阴影 ============== */}
<View style={styles.moduleBox}>
<Text style={styles.moduleTitle}>模块4:鸿蒙优化样式 · 行高+字符间距+阴影</Text>
<Text style={styles.textHarmonyOpt}>鸿蒙适配:行高28 + 字符间距2 + 文字阴影</Text>
<Text style={styles.textLetterSpace}>字符间距放大3dp · 鸿蒙API9+完美支持</Text>
</View>
{/* ============== 模块5:Text核心特性 · 嵌套实现富文本 ============== */}
<View style={styles.moduleBox}>
<Text style={styles.moduleTitle}>模块5:核心特性 · Text嵌套 → 富文本展示</Text>
<Text style={styles.textRichBase}>
我是富文本:
<Text style={styles.richRed}>红色加粗</Text>
的文字,拼接
<Text style={styles.richBlue}>蓝色下划线</Text>
文字,再拼接
<Text style={styles.richGreen}>绿色斜体</Text>
文字 → RN唯一支持嵌套的文本组件
</Text>
</View>
{/* ============== 模块6:文本交互事件 · 点击/长按 ============== */}
<View style={styles.moduleBox}>
<Text style={styles.moduleTitle}>模块6:文本交互 · 点击事件+长按事件</Text>
<Text style={styles.textClick} onPress={() => handleTextClick('可点击文本')}>
✅ 点击 → 控制台输出日志(鸿蒙环境)
</Text>
<Text style={styles.textLongClick} onLongPress={() => handleTextClick('长按文本')}>
✅ 长按 → 控制台输出日志(鸿蒙环境)
</Text>
</View>
{/* ============== 模块7:文本高级属性 · 选中/自适应缩放 ============== */}
<View style={styles.moduleBox}>
<Text style={styles.moduleTitle}>模块7:高级属性 · 长按选中+自动缩放</Text>
<Text style={styles.textSelect} selectable={true}>
✅ 长按可以选中复制这段文本
</Text>
<Text style={styles.textAutoScale} adjustsFontSizeToFit={true} minimumFontScale={0.5}>
✅ 自动缩放字体适配容器宽度,内容再长也不会溢出
</Text>
</View>
{/* ============== 模块8:文本与View结合 · 背景/圆角/内边距 ============== */}
<View style={styles.moduleBox}>
<Text style={styles.moduleTitle}>模块8:实战组合 · Text+View样式 标签式文本</Text>
<View style={styles.tagView}>
<Text style={styles.tagText}>鸿蒙原生标签</Text>
</View>
<View style={styles.tagView2}>
<Text style={styles.tagText2}>RN适配标签</Text>
</View>
</View>
</ScrollView>
);
};
const styles = StyleSheet.create({
// 页面根容器
pageContainer: {
flex: 1,
backgroundColor: '#f5f5f5',
padding: 16,
},
moduleBox: {
backgroundColor: '#ffffff',
borderRadius: 12,
padding: 16,
marginBottom: 20,
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.08,
shadowRadius: 4,
elevation: 2, // 鸿蒙阴影优化
},
// 模块标题样式
moduleTitle: {
fontSize: 18,
fontWeight: '700',
color: '#1a1a1a',
marginBottom: 12,
paddingBottom: 8,
borderBottomWidth: 1,
borderBottomColor: '#f0f0f0',
},
// 模块1:基础文本
textBasic: { fontSize: 16, color: '#333', marginBottom: 6 },
// 模块2:样式文本
textStyle1: { fontSize: 18, color: '#111', fontWeight: '600', marginBottom: 6 },
textStyle2: { fontSize: 14, color: '#666', textAlign: 'center', marginBottom: 6 },
textStyle3: { fontSize: 16, color: '#007aff', textDecorationLine: 'underline', marginBottom: 6 },
textStyle4: { fontSize: 14, color: '#999', textDecorationLine: 'line-through' },
// 模块3:多行文本
textMultiLine: { fontSize: 15, color: '#333', lineHeight: 22 },
// 模块4:鸿蒙优化样式
textHarmonyOpt: { fontSize: 16, color: '#222', lineHeight: 28, letterSpacing: 2, textShadowColor: '#999', textShadowOffset: { width: 1, height: 1 }, textShadowRadius: 2 },
textLetterSpace: { fontSize: 16, color: '#007aff', letterSpacing: 3, marginTop: 10 },
// 模块5:富文本样式
textRichBase: { fontSize: 15, color: '#333', lineHeight: 24 },
richRed: { color: '#ff3b30', fontWeight: '600' },
richBlue: { color: '#007aff', textDecorationLine: 'underline' },
richGreen: { color: '#34c759', fontStyle: 'italic' },
// 模块6:交互文本
textClick: { fontSize: 16, color: '#007aff', marginBottom: 10 },
textLongClick: { fontSize: 16, color: '#34c759' },
// 模块7:高级属性文本
textSelect: { fontSize: 15, color: '#333', marginBottom: 10 },
textAutoScale: { fontSize: 20, color: '#ff9500', width: 200 },
// 模块8:标签式文本
tagView: { backgroundColor: '#e8f4f8', borderRadius: 20, paddingHorizontal: 12, paddingVertical: 6, marginRight: 10, display: 'inline-block' },
tagView2: { backgroundColor: '#fef2f2', borderRadius: 20, paddingHorizontal: 12, paddingVertical: 6, marginTop: 8, display: 'inline-block' },
tagText: { color: '#007aff', fontSize: 14 },
tagText2: { color: '#ff3b30', fontSize: 14 },
});
export default TextComponentAllInOne;
3.2 运行效果说明

但是运行时候的日志实在太多了,我这里自定义了一下日志过滤

四、Text 组件核心进阶知识点
4.1 重中之重:为什么只有 Text 组件可以嵌套?
这是 RN 鸿蒙开发中 高频面试题 + 开发必知点,也是 Text 组件的核心特性:
React Native 中,所有组件里只有 Text 支持嵌套 Text,View 组件不能嵌套 Text 实现富文本。原因:RN 的 Text 组件底层是对鸿蒙原生
Text组件的封装,鸿蒙原生 Text 本身支持「文本分段样式」,RN 保留了这个特性,嵌套的 Text 会继承父 Text 的样式,也可自定义样式覆盖,从而实现富文本效果。✅ 开发技巧:富文本是 App 开发的刚需(比如协议文本的高亮、关键词标色),掌握 Text 嵌套即可轻松实现,无需引入第三方富文本库,鸿蒙环境无兼容问题。
4.2 鸿蒙跨平台 Text 性能优化技巧
本次优化技巧均为 代码层面的写法优化,无需引入任何依赖,且全部适配鸿蒙环境,是从「入门」到「精通」的关键分水岭,所有优化点均可以直接在上述完整代码中改造使用:
✅ 优化 1:避免 Text 组件的无用嵌套(最易踩坑)
// ❌ 反面示例:无用嵌套,增加渲染层级,鸿蒙性能损耗
<View>
<Text>
<Text>鸿蒙文本</Text>
</Text>
</View>
// ✅ 正面示例:简化嵌套,减少渲染节点,性能最优
<Text>鸿蒙文本</Text>
✅ 优化 2:使用 StyleSheet.create 统一管理样式(本文已实现)
RN 鸿蒙中,将样式抽离到 StyleSheet.create 中,鸿蒙会将样式编译为原生样式表,避免每次渲染都重新创建样式对象,提升渲染效率,这也是官方推荐的写法,本文所有代码均采用该方式。
✅ 优化 3:文本内容静态化,减少不必要的重渲染
如果文本内容是固定不变的(比如标题、提示语),无需绑定动态变量,直接写死字符串即可,鸿蒙会缓存该文本节点,不会触发重渲染。
✅ 优化 4:鸿蒙专属优化 - 关闭文本缩放(固定字体大小)
<Text allowFontScaling={false} style={styles.textBasic}>
字体大小不跟随鸿蒙系统缩放,保证UI一致性
</Text>
五、Text 组件鸿蒙开发 常见问题 & 解决方案
开发中 90% 的 Text 组件问题都集中在以下 6 类,全部为鸿蒙环境实测的高频问题,原因 + 解决方案 清晰给出,遇到问题直接查,无需踩坑:
| 问题现象 | 核心原因 | 鸿蒙适配解决方案 |
|---|---|---|
| 文本超出容器边界,无法换行 | 1.Text 未设置宽度;2. 父容器是行内布局 | 1. 给 Text 设置固定宽度 /% 宽度;2. 父 View 添加flex:1;鸿蒙默认支持自动换行 |
numberOfLines 行数限制不生效 |
1. 配合ellipsizeMode使用;2.Text 无固定高度 |
1. 必传ellipsizeMode(推荐 tail);2. 给 Text 设置lineHeight+ 固定高度,鸿蒙完美兼容 |
| 文本选中功能(selectable)失效 | 鸿蒙 API 版本低于 9,或文本被父组件遮挡 | 1. 升级鸿蒙 SDK 到 API9+;2. 检查父组件pointerEvents是否为 none,改为 auto 即可 |
| 富文本嵌套样式不生效 | 子 Text 样式被父 Text 覆盖,或嵌套层级过深 | 子 Text 明确写全样式(比如 color/fontWeight),覆盖父样式;鸿蒙建议嵌套层级≤3 层 |
| 文本阴影显示不清晰 | 阴影参数设置不全,鸿蒙渲染规则不同 | 同时设置textShadowColor+textShadowOffset+textShadowRadius,缺一不可 |
| 字体在鸿蒙真机显示异常 | 使用了鸿蒙不兼容的第三方字体 | 推荐使用鸿蒙原生字体「HarmonyOS Sans」,无需额外引入,兼容性 100% |
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
更多推荐




所有评论(0)