rich-text 富文本

解释: 富文本,nodes 属性推荐使用 Array 类型,由于组件会将 String 类型转换为 Array 类型,因而性能会有所下降。

属性说明

属性名类型默认值必填说明
nodesArray | String[]节点列表 / HTML String
selectableBooleanfalse(基础库3.150.1以前版本)true(基础库3.150.1及以后版本)富文本是否可以长按选中,可用于复制,粘贴,长按搜索等场景。百度 APP 11.10 以上
name标签名String支持部分受信任的HTML节点
attrs属性Object支持部分受信任的属性,遵循Pascal命名法
children子节点列表Array结构和nodes一致
text文本String支持entities

nodes

现支持两种节点,通过type来区分,分别是 元素节点 和 文本节点 ,默认是元素节点,在富文本区域里显示的HTML节点。

说明
node元素节点
text文本节点

受信任的HTML节点属性说明

全局支持class和style属性,不支持id属性。

节点属性
a
abbr-
b-
blockquote
br
code-
colspan,width
colgroupspan,width
dd
del
div-
dl-
dt-
em
fieldset-
h1-
h2-
h3-
h4-
h5-
h6-
hr
i-
imgalt,src,height,width
ins-
label-
legend-
li
olstart,type
p
q-
span-
strong
sub-
sup-
tablewidth
tbody-
tdcolspan,height,rowspan,width
tfoot
thcolspan,height,rowspan,width
thead-
tr
ul-

示例

在开发者工具中预览效果

扫码体验

rich-text 富文本 - 图1请使用百度APP扫码

代码示例

  1. <view class="rich-text">
  2. <view class="renders">
  3. <view class="renders_title">通过HTML String渲染</view>
  4. <view class="renders_view">
  5. <scroll-view scroll-y>
  6. <view class="cont">{{htmlSnip}}</view>
  7. </scroll-view>
  8. <button type="primary" bind:tap="renderHtml">渲染HTML</button>
  9. <block s-if="{{renderedByHtml}}">
  10. <!-- 基础库 3.150.1 以前的版本,selectable 属性默认为 false,期望文本不可被选中时不用设置此属性 -->
  11. <rich-text nodes="{{htmlSnip}}"></rich-text>
  12. <!-- 基础库 3.150.1 及以后版本,selectable 属性默认为 true,期望文本不可被选中时需设置此属性为 false -->
  13. <!-- <rich-text selectable="false" nodes="{{htmlSnip}}"></rich-text> -->
  14. </block>
  15. </view>
  16. </view>
  17. <view class="renders">
  18. <view class="renders_title">通过节点渲染</view>
  19. <view class="renders_view">
  20. <scroll-view scroll-y>
  21. <view class="cont">{{nodeSnip}}</view>
  22. </scroll-view>
  23. <button type="primary" bind:tap="renderNode">渲染Node</button>
  24. <block s-if="{{renderedByNode}}" style="margin-bottom:.5rem;">
  25. <!-- 基础库 3.150.1 以前的版本,selectable 属性默认为 false,期望文本不可被选中时不用设置此属性 -->
  26. <rich-text nodes="{{nodes}}"></rich-text>
  27. <!-- 基础库 3.150.1 及以后版本,selectable 属性默认为 true,期望文本不可被选中时需设置此属性为 false -->
  28. <!-- <rich-text selectable="false" nodes="{{nodes}}"></rich-text> -->
  29. </block>
  30. </view>
  31. </view>
  32. </view>
  1. const htmlSnip =
  2. `<div class="div_class">
  3. <h1>Title</h1>
  4. <p class="p">
  5. Life is&nbsp;<i>like</i>&nbsp;a box of
  6. <b>&nbsp;chocolates</b>
  7. </p>
  8. </div>`;
  9. const nodeSnip =
  10. `Page({
  11. data: {
  12. nodes: [{
  13. name: 'div',
  14. attrs: {
  15. class: 'div_class',
  16. style: 'line-height: 60px; color: #4F99FB;'
  17. },
  18. children: [{
  19. type: 'text',
  20. text: 'You never know what you're gonna get.'
  21. }]
  22. }]
  23. }
  24. })`;
  25. Page({
  26. data: {
  27. htmlSnip,
  28. nodeSnip,
  29. renderedByHtml: false,
  30. renderedByNode: false,
  31. nodes: [{
  32. name: 'div',
  33. attrs: {
  34. class: 'div_class',
  35. style: 'line-height: 60px; color: #4F99FB;'
  36. },
  37. children: [{
  38. type: 'text',
  39. text: 'You never know what you\'re gonna get.'
  40. }]
  41. }]
  42. },
  43. renderHtml() {
  44. this.setData({
  45. renderedByHtml: true
  46. });
  47. },
  48. renderNode() {
  49. this.setData({
  50. renderedByNode: true
  51. });
  52. },
  53. enterCode(e) {
  54. this.setData({
  55. htmlSnip: e.detail.value
  56. });
  57. }
  58. });

Bug & Tip

  • Tip:单击此处,查看将富文本字符串转成 json 格式的具体方法。
  • Tip:支持默认事件,包括:tap、touchstart、touchmove、touchcancel、touchend和longtap。
  • Tip:nodes 不推荐使用 String 类型,性能会有所下降。
  • Tip:rich-text 组件内屏蔽所有节点的事件。
  • Tip:attrs 属性不支持 id,支持 class。
  • Tip:name 属性大小写不敏感。
  • Tip:如果使用了不受信任的HTML节点,该节点及其所有子节点将会被移除。
  • Tip:img 标签仅支持网络图片。
  • Tip:如果在自定义组件中使用 rich-text 组件,那么仅自定义组件的 swan 样式对 rich-text 中的 class 生效。

参考示例

参考示例 1

在开发者工具中预览效果

  1. <view class="rich-text">
  2. <view class="renders">
  3. <view class="renders_title">通过HTML String渲染</view>
  4. <view class="renders_view">
  5. <scroll-view scroll-y>
  6. <view class="cont">{{htmlSnip}}</view>
  7. </scroll-view>
  8. <rich-text nodes="{{htmlSnip}}" selectable="true"></rich-text>
  9. </view>
  10. </view>
  11. </view>
  1. const htmlSnip =
  2. `<div class="div_class">
  3. <h1>Title</h1>
  4. <p class="p">
  5. Life is&nbsp;<i>like</i>&nbsp;a box of
  6. <b>&nbsp;chocolates</b>
  7. </p>
  8. </div>`;
  9. Page({
  10. data: {
  11. htmlSnip
  12. }
  13. });

参考示例 2

在开发者工具中预览效果

  1. <view class="rich-text">
  2. <view class="renders">
  3. <view class="renders_title">通过节点渲染</view>
  4. <view class="renders_view">
  5. <scroll-view scroll-y>
  6. <view class="cont">{{nodeSnip}}</view>
  7. </scroll-view>
  8. <rich-text nodes="{{nodes}}" selectable="true">
  9. </rich-text>
  10. </view>
  11. </view>
  12. </view>
  1. const nodeSnip
  2. =`
  3. Page({
  4. data: {
  5. nodes: [{
  6. name: 'div',
  7. attrs: {
  8. class: 'div_class',
  9. style: 'line-height: 60px; color: #4F99FB;;'
  10. },
  11. children: [{
  12. type: 'text',
  13. text: 'You never know what you're gonna get.'
  14. }]
  15. }]
  16. }
  17. })`;
  18. Page({
  19. data: {
  20. nodeSnip,
  21. nodes: [{
  22. name: 'div',
  23. attrs: {
  24. class: 'div_class',
  25. style: 'line-height: 60px; color: #4F99FB;'
  26. },
  27. children: [{
  28. type: 'text',
  29. text: 'You never know what you\'re gonna get.'
  30. }]
  31. }]
  32. }
  33. });