RichText组件是什么及使用方法
RichText组件是鸿蒙开发中比较常用的基础组件——富文本组件,用于解析显示HTML格式文本。
适用场景:
- RichText组件适用于加载与显示一段HTML字符串,且不需要对显示效果进行较多自定义的应用场景。
- RichText组件底层复用了Web组件来提供基础能力,包括但不限于HTML页面的解析、渲染等。
- 移动设备的视口默认值大小为980px,默认值可以确保大部分网页在移动设备下可以正常浏览。如果RichText组件宽度低于这个值,content内部的HTML则可能会产生一个可以滑动的页面被RichText组件包裹。如果想替换默认值,可以在content中添加以下标签:
<meta name="viewport" content="width=device-width">
不适用场景:
- RichText组件不适用于对HTML字符串的显示效果进行较多自定义。
- RichText组件不支持通过设置属性与事件,来修改背景颜色、字体颜色、字体大小、动态改变内容等。
- RichText组件比较消耗内存资源,如需要重复使用RichText组件的场景下会出现卡顿、滑动响应慢等现象。
注意:RichText组件无法根据内容自适应设置宽高属性,需要开发者设置显示布局。
事件
onStart:加载网页时触发
onComplete:网页加载结束时触发
示例:
RichText('<p>这是一个段落</p>')
.onStart(() => {
console.info('网页开始加载');
})
.onComplete(() => {
console.info('网页内容加载完毕');
})
属性
只支持通用属性中的width,height,size,layoutWeight四个属性。
支持标签
名称 | 描述 | 示例 |
---|---|---|
<h1>--<h6> | 被用来定义HTML,<h1>定义重要等级最高的标题,<h6>定义重要等级最低的标题。 | <h1>这是一个标题</h1><h2>这是h2标题</h2> |
<p></p> | 定义段落。 | <p>这是一个段落</p> |
<br/> | 插入一个简单的换行符。 | <p>这是一个段落<br/>这是换行段落</p> |
<font/> | 规定文本的字体、字体尺寸、字体颜色。在标签中font size能够设置的值只有1到7的数字,默认值是3,由于标签在HTML 4.01中不建议使用,在XHTML1.0 Strict DTD中不支持,所以不建议使用此标签,请使用CSS代替。 | <font size="3" face="arial" color="red">这是一段红色字体。</font> |
<hr/> | 定义HTML页面中的主题变化(比如话题的转移),并显示为一条水平线。 | <p>这个一个段落</p><hr/><p>这是一个段落</p> |
<image></image> | 用来定义图片。 | <image src="resource://rawfile/icon.png"></image> |
<div></div> | 常用于组合块级元素,以便通过CSS来对这些元素进行格式化。 | <div style='color:#0000FF'><h3>这是一个在div元素中的标题。</h3></div> |
<i></i> | 定义与文本中其余部分不同的部分,并把这部分文本呈现为斜体文本。 | <i>这是一个斜体</i> |
<u></u> | 定义与常规文本风格不同的文本,像拼写错误的单词或者汉语中的专有名词,应尽量避免使用<u>为文本加下划线,用户会把它混淆为一个超链接。 | <p><u>这是带有下划线的段落</u></p> |
<style></style> | 定义HTML文档的样式信息。 | <style>h1{color:red;}p{color:blue;}</style> |
style | 属性规定元素的行内样式,写在标签内部,在使用的时候需用引号来进行区分,并以; 间隔样式 | <h1 style='color:blue;text-align:center'>这是一个标题</h1><p style='color:green'>这是一个段落。</p> |
<script></script> | 用于定义客户端脚本,比如JavaScript。 | <script>document.write("Hello World!")</script> |
坑点
以下总结的坑点是我在开发过程中自己碰到的,以及实践过的。。。
1、当RichText组件中的内容超出容器范围时,内容可以滚动。因为RichText底层是由webview实现,所以浏览器规格一致,内容超出会提供滚动条进行滑动。
代码如下:
@Entry
@Component
struct DemoPage {
build() {
Column() {
// 内容区
Text('以下为RichText内容')
.fontSize(30)
.fontWeight(FontWeight.Bold)
.backgroundColor(Color.Pink)
Scroll() {
RichText('<h1 style="text-align: center;">h1标题</h1>' +
'<h1 style="text-align: center;"><i>h1斜体</i></h1>' +
'<h1 style="text-align: center;"><u>h1下划线</u></h1>' +
'<h2 style="text-align: center;">h2标题</h2>' +
'<h3 style="text-align: center;">h3标题</h3>' +
'<p style="text-align: center;">p常规</p><hr/>' +
'<div style="width: 500px;height: 500px;border: 1px solid;margin: 0 auto;">' +
'<p style="font-size: 35px;text-align: center;font-weight: bold; color: rgb(24,78,228)">字体大小35px,行高45px</p>' +
'<p style="background-color: #e5e5e5;line-height: 45px;font-size: 35px;text-indent: 2em;">' +
'<p>这是一段文字这是一段文字这是一段文字这是一段文字这是一段文字这是一段文字这是一段文字这是一段文字这是一段文字</p>' +
'<h1 style="text-align: center;"><i>h1斜体</i></h1>' +
'<h1 style="text-align: center;"><u>h1下划线</u></h1>' +
'<h2 style="text-align: center;">h2标题</h2>' +
'<h3 style="text-align: center;">h3标题</h3>' +
'<p style="text-align: center;">p常规</p><hr/>'
)
.width('100%')
.height(100)
}
.layoutWeight(1)
}
.backgroundColor(Color.Orange)
.width('100%')
.height('100%')
.padding({ top: 50 })
}
}
可以看到给定RichText设置了100的高度,但是组件内容的高度超过了100,内容就自动可以滚动了。
2、RichText渲染HTML内容在页面中的时候,发现字体会非常小,跟原本在.html文件中显示的不一致。参考官方文档中给的解释说,可以在HTML中加一个meta标签<meta name="viewport" content="width=device-width, initial-scale=1.0">可以让字体正常显示。
但是,我在html文本中加上了meta标签运行之后的文字还是非常小:
RichText(`
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<h1 style="text-align: center;">h1标题</h1><h1 style="text-align: center;"><i>h1斜体</i></h1>
`)
.width('100%')
后来我又想是不是因为缺少了文档类型、html标签以及body标签,导致RichText识别不出来,后来发现是我想多了,运行结果还是跟上面一样。
RichText(`
<!DOCTYPE html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
</head>
<html>
<body>
<h1 style="text-align: center;">h1标题</h1><h1 style="text-align: center;"><i>h1斜体</i></h1>
</body>
</html>
`)
.width('100%')
后来问了华为那边的工程师,给出的解释是RichText组件不适用于对HTML字符串的显示效果进行较多自定义的应用场景。例如RichText组件不支持通过设置属性与事件,来修改背景颜色、字体颜色、字体大小、动态改变内容等。
对于这种情况,还有一个场景就是获取的数据是从后端接口返回的,刚好返回的就是富文本或者HTML内容,需要对内容进行页面渲染,还是建议使用web组件。