react-native-render-html

场景

需要将 html 的 UI 渲染标准迁移到 react-native 的跨平台组件上

简单推测处理过程

html parse->compute style-> cssom+dom map 到 RNom(主要是组件映射,属性映射,这个阶段可以干预)->渲染成 RNElements
流程是阶段性流程

源码流程梳理

  • registerDOM:记录将要渲染的 html 内容
  • parseDOM:解析 html 出 dom
  • htmlparser2.Parser DomHandler:dom 解析完毕,拿到 DOMNodes(类型为 DomElement 的 dom 节点数组)
  • mapDOMNodesTORNElements 将 DOMNodes 转换成 RNElements
    • 可以选择 ignoreNodesFunction,ignoredTags 忽略某些 tag 标签以及指定 Node
    • 可以操作替换节点,可以操作替换节点数据,可以操作替换孩子节点
    • 如果是叶子节点(只是纯文本内容),映射成一个 Text 组件,样式就是 dom node 节点的样式属性
    • 如果是标签节点(ps:标签就认为是一个容器)
      • 递归计算所有 children node 出 RNElements
      • 当前标签不是只包含文本就需要被映射为 View 容器
      • tag 是那种纯文本的标签,被映射成 Text 容器
      • 如果 tag 是自定义的,可以调用自定义的 renders 标签函数处理
      • 最后条件都不满足默认就认为是 View 容器
      • 将以上拿到组装 RNElements 的参数定义,尝试进行递归层次合并。(发现子节点和自己是同一个容器类型,且属性相同)
      • 将以上参数转换成实际的 RNElements 组件
      • 最后尝试合并那些不需要独立成行的 tag 文本的组件
  • RNNodes 被包裹一个容器渲染到页面

官方文档翻译

一个纯 js 实现用来将 html 内容 100%绘制到原生上的 rn 组件,支持 Android/iOS。它能够 easy 自定义和使用。

安装

从 4.2.0 版本开始,react-native-webview 是一个独立的库。你需要自行安装它

Props

属性 描述 类型 值要求
renderers 你自定义标签渲染函数 custom renders object
renderersProps custom renders 函数里的第四个参数 props object 可选
html 需要渲染的 html 文本 string 必须
uri 网址内容的解析和渲染(实验中) string 可选
decodeEntities 这个是 html parse2 的参数,(大意是文档中的实体也会被解析?) bool 默认是 true
imagesMaxWidth 调整图片到最大宽度 number 可选
staticContentMaxWidth 设置非响应式内容的最大宽度(iframe 实例)(ps:得验证) number 可选
imagesInitialDimensions 图片的默认显示的宽高{width:100,height:100} number 可选
onLinkPress 随着点击事件触发,url 和标签属性对象将作为回调函数的参数 function 可选
onParsed 当 html 内容被解析完成时触发,对调整渲染后续过程有帮助 function 可选
tagsStyles 可以指定 html 标签的显示的 rn style object 可选
classesStyles 可以指定 html 中类的 rn style object 可选
listsPrefixesRenderers 包含自定义 ul,ol 的前缀渲染函数对象 object 可选
containerStyle html 容器的样式 object 可选
customWrapper 替换掉默认的 warpper 的函数,第一个参数是渲染的内容。 function 可选
remoteLoadingView 替换默认加载网络内容的加载框 function 可选
emSize 1em 对应的像素值 number 14
ptSize 1pt 对应的像素值 number 1.3
baseFontStyleText 组件的默认样式 object {fontSize:14}
allowFontScaling 允许字体大小被缩放的开关 boolean true
textSelectable 允许所有文本被选中 boolean false
alterData 指定文本改变目标节点的内容 function 可选
alterChildren 修改目标的节点的 children function 可选
alterNode 修改目标节点 function 可选
ignoreTags 指定不想渲染的 html 标签 array 可选
allowStyles 它只渲染给定的 style,如果这个 style 也在 ignoreStyles 下,则还是忽略 array 可选 (应该是 background 这类样式属性)
ignoredStyles 不想渲染的 style array 可选
ignoreNodesFunction 忽略给定节点 function 可选
debug 打印 htmlparser2 的解析 result,渲染的结果 boolean false