Skip to main content

rich-text

rich text component.

Example

bxml


<view class="container">
<head title="rich-text"></head>
<view class="page-section tc">
<view class="page-body">
<view class="rich-text-picker">
<picker
mode="selector"
range="{{SPACE_RANGE}}"
value="{{rangeIndex}}"
bindchange="onPickChange"
>
<view class="bnui-input">
Select a space:&nbsp;
{{space || "default"}}
</view>
</picker>
</view>

<view class="page-section">
<view class="page-section-title">HTML string</view>
<view class="rich-text-textarea-wrapper">
<textarea
value="{{html}}"
bindinput="onTextareaInput"
maxlength="{{3000}}"
/>
</view>
<view class="rich-text-wrp">
<rich-text
nodes="{{html}}"
space="{{space}}"
bindtap="onRichTextTap"
bind:longpress="onRichTextLongPress"
></rich-text>
</view>
</view>

<view class="page-section">
<view class="page-section-title">Nodes</view>
<view class="rich-text-textarea-wrapper">
<textarea
value="{{nodesStr}}"
bindinput="onNodesChange"
maxlength="{{3000}}"
/>
</view>
<view class="rich-text-wrp">
<rich-text
nodes="{{nodes}}"
space="{{space || undefined}}"
></rich-text>
</view>
</view>
</view>
</view>
</view>

js

Page({
data: {
SPACE_RANGE: ['', 'nbsp', 'ensp', 'emsp'],
rangeIndex: 1,
space: 'nbsp',
html: `<span>
<div
class="div_class"
style="line-height: 16px; color: red;"
id="div"
>
Hello&nbsp;World!1&emsp;2&ensp;3
</div>
<ol start="10">
<li>ol with 'start=10'</li>
</ol>
<tr colspan="1" rowSpan="2">case-insensitive</tr>
<img src="https://github.githubassets.com/images/icons/emoji/tada.png" style="width: 20px">
</span>`,
nodes: [
{
name: 'div',
attrs: {
class: 'div_class',
style: 'line-height: 16px; color: red;',
id: 'div'
},
children: [
{
type: 'text',
text: 'Hello&nbsp;World!1&emsp;2&ensp;3'
}
]
}
],
nodesStr: JSON.stringify([
{
name: 'div',
attrs: {
class: 'div_class',
style: 'line-height: 16px; color: red;',
id: 'div'
},
children: [
{
type: 'text',
text: 'Hello&nbsp;World!1&emsp;2&ensp;3'
}
]
}
], null, 2)
},
onPickChange(e) {
console.log('[rich-text] onPickChange', e);
const space = this.data.SPACE_RANGE[e.detail.value]
this.setData({
space,
rangeIndex: e.detail.value
})
},
onTextareaInput(e) {
this.setData({
html: e.detail.value
})
},
onRichTextTap(){
console.log(`[rich-text] bindtap`, e)
},
onRichTextLongPress(){
console.log(`[rich-text] onLongPress`, e)
},
onNodesChange(e) {
try {
const nodes = JSON.parse(e.detail.value)
console.log('[rich-text] onNodesChange', nodes);
this.setData({
nodes,
nodesStr: e.detail.value
})
} catch (error) {
console.log(error)
}
}
})

Props

PropertyTypeDefault ValueRequiredDescription
nodesarray/string[]trueNode list/HTML String
spacestringtextfalseDisplay continuous spaces

Valid values of nodes

Now supports two types of nodes, distinguished by type, namely element nodes and text nodes, the default is element nodes, HTML nodes displayed in the rich text area.

type = node

ValueTypeDescription
namestringtag name
attrsObjectattributes
childrenarraychildren of this element.

type = text

ValueTypeDescription
textstringtext

Bug & Tip

  • tip: nodes Not recommended. String Type, performance will drop.
  • tip: Masking all node events within a component.
  • tip: attrs Property is not supported id Support class.
  • tip: name Property is not case sensitive.
  • tip: If an untrusted HTML node is used, the node and all its children are removed.
  • tip: img Tags only support web pictures
  • tip: If you use the rich-text Component, then only the custom component s wxss Style pair rich-text to hit the target class Entry into force.