Reconciler

Taro 的运行时包括 DOM、BOM、React 兼容层、Vue 兼容层等内容,而不同的端平台或开发框架都有可能需要对 Taro 运行时进行侵入定制。

为了解耦,我们参考了 React Reconciler 的概念,外部可以通过提供一个自定义的 hostConfig 配置对象,对运行时进行定制。

遇到 hostConfig 的配置项不满足需求,需要进行扩展时,可以给 Taro 提交 PR~

hostConfig 配置

appendChild (parent, child)

DOMNode 调用 appendChild 方法时触发。

参数类型说明
parentDOMNode父节点
childDOMNode / TextElement要给父节点追加的节点

removeChild (parent, child, oldChild)

DOMNode 调用 replaceChild 方法时触发。

参数类型说明
parentDOMNode父节点
childDOMNode / TextElement用来替换 oldChild 的新节点
oldChildDOMNode / TextElement被替换掉的原始节点

insertBefore (parent, child, refChild)

DOMNode 调用 insertBefore 方法时触发。

参数类型说明
parentDOMNode父节点
childDOMNode / TextElement用于插入的节点
refChildDOMNode / TextElement将要插在这个节点之前

removeAttribute (element, qualifiedName)

DOMElement 调用 removeAttribute 方法时触发。

参数类型说明
elementDOMElement当前操作元素
qualifiedNamestring指定要从元素中移除的属性的名称

setAttribute (element, qualifiedName, value)

DOMElement 调用 setAttribute 方法时触发。

参数类型说明
elementDOMElement当前操作元素
qualifiedNamestring表示属性名称的字符串
value属性的值/新值

prepareUpdateData (data, page)

每次 Taro DOM 树更新,调用小程序 setData 前触发。

参数类型说明
dataDataTree将要 setData 的 Taro DOM 树数据结构
pageTaroRootElement页面根元素

appendInitialPage (data, page)

Taro DOM 树初始化,第一次调用小程序 setData 前触发。在调用 prepareUpdateData 后立刻执行。

参数类型说明
dataDataTree将要 setData 的 Taro DOM 树数据结构
pageTaroRootElement页面根元素

getLifecyle (instance, lifecyle)

小程序页面的生命周期被触发时调用。

参数类型说明
instanceInstance用户编写的页面实例
lifecylestring小程序页面被触发的生命周期函数名称

需要返回 functionfunction[],表示将要执行的函数。

例子:

  1. // 默认值:
  2. // 直接取用户编写的页面实例中,对应的生命周期方法
  3. getLifecyle (instance, lifecyle) {
  4. return instance[lifecyle]
  5. }
  6. // 在 React 中,
  7. // 小程序触发 onShow,调用用户编写的 componentDidShow
  8. // 小程序触发 onHide,调用用户编写的 componentDidHide
  9. getLifecyle (instance, lifecycle) {
  10. if (lifecycle === 'onShow') {
  11. lifecycle = 'componentDidShow'
  12. } else if (lifecycle === 'onHide') {
  13. lifecycle = 'componentDidHide'
  14. }
  15. return instance[lifecycle]
  16. }

onTaroElementCreate (tagName, nodeType)

DOMElement 构造时触发。

参数类型说明
tagNamestring当前创建的元素的标签名
nodeTypeNodeType当前创建的元素的节点类型
nodeType说明
1ELEMENT_NODE
2ATTRIBUTE_NODE
3TEXT_NODE
4CDATA_SECTION_NODE
5ENTITY_REFERENCE_NODE
6COMMENT_NODE
7PROCESSING_INSTRUCTION_NODE
9DOCUMENT_NODE

getPathIndex (indexOfNode)

DOMNode 获取 path 属性时触发。

参数类型说明
indexOfNodenumber当前节点在父节点 children 列表中的下标

需要返回一个 string 值,代表小程序按路径 setData 时的数组下标。

例子:

  1. // 默认值:
  2. getPathIndex (indexOfNode) {
  3. return `[${indexOfNode}]`
  4. }
  5. // 百度小程序不需要 [] 包裹
  6. getPathIndex (indexOfNode) {
  7. return indexOfNode
  8. }

getEventCenter(Events)

Taro.eventCenter 初始化值时触发。

参数类型说明
EventsTaro 事件中心的构造函数

需要返回 Taro 事件中心的实例,其将会被赋值给 Taro.eventCenter

例子:

  1. // 默认值:
  2. getEventCenter (Events) {
  3. return new Events()
  4. }
  5. // 支付宝小程序中,
  6. // 优先从小程序全局对象 my 中取出创建过的事件中心实例,避免分包时出现问题。
  7. getEventCenter (Events) {
  8. if (!my.taroEventCenter) {
  9. my.taroEventCenter = new Events()
  10. }
  11. return my.taroEventCenter
  12. }

initNativeApi (taro)

引用 @tarojs/taro 包时触发。

参数类型说明
taroTaro 对象

例子:

  1. initNativeApi (taro) {
  2. // 为 Taro 对象增加 getApp 方法
  3. taro.getApp = getApp
  4. }