@tarojs/runtime 3.6.25 → 3.6.26-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/dom/node.js CHANGED
@@ -257,6 +257,8 @@ class TaroNode extends TaroEventTarget {
257
257
  }
258
258
  // Data Structure
259
259
  const index = this.findIndex(child);
260
+ const isLastChild = index === this.childNodes.length - 1;
261
+ const path = child._path;
260
262
  this.childNodes.splice(index, 1);
261
263
  child.parentNode = null;
262
264
  // Set eventSource
@@ -265,7 +267,15 @@ class TaroNode extends TaroEventTarget {
265
267
  }
266
268
  // Serialization
267
269
  if (this._root && doUpdate !== false) {
268
- this.updateChildNodes();
270
+ if (isLastChild) {
271
+ this.enqueueUpdate({
272
+ path,
273
+ value: null
274
+ });
275
+ }
276
+ else {
277
+ this.updateChildNodes();
278
+ }
269
279
  }
270
280
  return child;
271
281
  }
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","sources":["../../src/dom/node.ts"],"sourcesContent":["import { ensure, hooks, Shortcuts } from '@tarojs/shared'\n\nimport { DOCUMENT_FRAGMENT } from '../constants'\nimport { MutationObserver, MutationRecordType } from '../dom-external/mutation-observer'\nimport env from '../env'\nimport { hydrate } from '../hydrate'\nimport { extend, incrementId, isComment } from '../utils'\nimport { eventSource } from './event-source'\nimport { TaroEventTarget } from './event-target'\nimport { NodeType } from './node_types'\n\nimport type { TFunc, UpdatePayload } from '../interface'\nimport type { TaroDocument } from './document'\nimport type { TaroElement } from './element'\nimport type { TaroRootElement } from './root'\n\ninterface RemoveChildOptions {\n cleanRef?: boolean\n doUpdate?: boolean\n}\n\nconst CHILDNODES = Shortcuts.Childnodes\nconst nodeId = incrementId()\n\nexport class TaroNode extends TaroEventTarget {\n public uid: string\n public sid: string\n public nodeType: NodeType\n public nodeName: string\n public parentNode: TaroNode | null = null\n public childNodes: TaroNode[] = []\n\n public constructor () {\n super()\n this.uid = '_' + nodeId() // dom 节点 id,开发者可修改\n this.sid = this.uid // dom 节点全局唯一 id,不可被修改\n eventSource.set(this.sid, this)\n }\n\n private hydrate = (node: TaroNode) => () => hydrate(node as TaroElement)\n\n private updateChildNodes (isClean?: boolean) {\n const cleanChildNodes = () => []\n const rerenderChildNodes = () => {\n const childNodes = this.childNodes.filter(node => !isComment(node))\n return childNodes.map(hydrate)\n }\n\n this.enqueueUpdate({\n path: `${this._path}.${CHILDNODES}`,\n value: isClean ? cleanChildNodes : rerenderChildNodes\n })\n }\n\n private updateSingleChild (index: number) {\n this.childNodes.forEach((child, childIndex) => {\n if (isComment(child)) return\n\n if (index && childIndex < index) return\n\n this.enqueueUpdate({\n path: child._path,\n value: this.hydrate(child)\n })\n })\n }\n\n public get _root (): TaroRootElement | null {\n return this.parentNode?._root || null\n }\n\n protected findIndex (refChild: TaroNode): number {\n const index = this.childNodes.indexOf(refChild)\n\n ensure(index !== -1, 'The node to be replaced is not a child of this node.')\n\n return index\n }\n\n public get _path (): string {\n const parentNode = this.parentNode\n\n if (parentNode) {\n // 计算路径时,先过滤掉 comment 节点\n const list = parentNode.childNodes.filter(node => !isComment(node))\n const indexOfNode = list.indexOf(this)\n const index = hooks.call('getPathIndex', indexOfNode)\n\n return `${parentNode._path}.${CHILDNODES}.${index}`\n }\n\n return ''\n }\n\n public get nextSibling (): TaroNode | null {\n const parentNode = this.parentNode\n return parentNode?.childNodes[parentNode.findIndex(this) + 1] || null\n }\n\n public get previousSibling (): TaroNode | null {\n const parentNode = this.parentNode\n return parentNode?.childNodes[parentNode.findIndex(this) - 1] || null\n }\n\n public get parentElement (): TaroElement | null {\n const parentNode = this.parentNode\n if (parentNode?.nodeType === NodeType.ELEMENT_NODE) {\n return parentNode as TaroElement\n }\n return null\n }\n\n public get firstChild (): TaroNode | null {\n return this.childNodes[0] || null\n }\n\n public get lastChild (): TaroNode | null {\n const childNodes = this.childNodes\n return childNodes[childNodes.length - 1] || null\n }\n\n /**\n * @textContent 目前只能置空子元素\n * @TODO 等待完整 innerHTML 实现\n */\n // eslint-disable-next-line accessor-pairs\n public set textContent (text: string) {\n const removedNodes = this.childNodes.slice()\n const addedNodes: TaroNode[] = []\n\n // Handle old children' data structure & ref\n while (this.firstChild) {\n this.removeChild(this.firstChild, { doUpdate: false })\n }\n\n if (text === '') {\n this.updateChildNodes(true)\n } else {\n const newText = env.document.createTextNode(text)\n addedNodes.push(newText)\n this.appendChild(newText)\n this.updateChildNodes()\n }\n\n // @Todo: appendChild 会多触发一次\n MutationObserver.record({\n type: MutationRecordType.CHILD_LIST,\n target: this,\n removedNodes,\n addedNodes\n })\n }\n\n /**\n * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/insertBefore\n * @scenario\n * [A,B,C]\n * 1. insert D before C, D has no parent\n * 2. insert D before C, D has the same parent of C\n * 3. insert D before C, D has the different parent of C\n */\n public insertBefore<T extends TaroNode> (newChild: T, refChild?: TaroNode | null, isReplace?: boolean): T {\n if (newChild.nodeName === DOCUMENT_FRAGMENT) {\n newChild.childNodes.reduceRight((previousValue, currentValue) => {\n this.insertBefore(currentValue, previousValue)\n return currentValue\n }, refChild)\n return newChild\n }\n\n // Parent release newChild\n // - cleanRef: false (No need to clean eventSource, because newChild is about to be inserted)\n // - update: true (Need to update parent.childNodes, because parent.childNodes is reordered)\n newChild.remove({ cleanRef: false })\n\n let index = 0\n // Data structure\n newChild.parentNode = this\n if (refChild) {\n // insertBefore & replaceChild\n index = this.findIndex(refChild)\n this.childNodes.splice(index, 0, newChild)\n } else {\n // appendChild\n this.childNodes.push(newChild)\n }\n\n const childNodesLength = this.childNodes.length\n // Serialization\n if (this._root) {\n if (!refChild) {\n // appendChild\n const isOnlyChild = childNodesLength === 1\n if (isOnlyChild) {\n this.updateChildNodes()\n } else {\n this.enqueueUpdate({\n path: newChild._path,\n value: this.hydrate(newChild)\n })\n }\n } else if (isReplace) {\n // replaceChild\n this.enqueueUpdate({\n path: newChild._path,\n value: this.hydrate(newChild)\n })\n } else {\n // insertBefore 有两种更新模式\n // 比方说有 A B C 三个节点,现在要在 C 前插入 D\n // 1. 插入 D,然后更新整个父节点的 childNodes 数组\n // setData({ cn: [A, B, D, C] })\n // 2. 插入 D,然后更新 D 以及 D 之后每个节点的数据\n // setData ({\n // cn.[2]: D,\n // cn.[3]: C,\n // })\n // 由于微信解析 ’cn.[2]‘ 这些路径的时候也需要消耗时间,\n // 所以根据 insertBefore 插入的位置来做不同的处理\n const mark = childNodesLength * 2 / 3\n if (mark > index) {\n // 如果 insertBefore 的位置在 childNodes 的 2/3 前,则为了避免解析路径消耗过多的时间,采用第一种方式\n this.updateChildNodes()\n } else {\n // 如果 insertBefore 的位置在 childNodes 的 2/3 之后,则采用第二种方式,避免 childNodes 的全量更新\n this.updateSingleChild(index)\n }\n }\n }\n\n MutationObserver.record({\n type: MutationRecordType.CHILD_LIST,\n target: this,\n addedNodes: [newChild],\n removedNodes: isReplace\n ? [refChild as TaroNode] /** replaceChild */\n : [],\n nextSibling: isReplace\n ? (refChild as TaroNode).nextSibling /** replaceChild */\n : (refChild || null), /** insertBefore & appendChild */\n previousSibling: newChild.previousSibling\n })\n\n return newChild\n }\n\n /**\n * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/appendChild\n * @scenario\n * [A,B,C]\n * 1. append C, C has no parent\n * 2. append C, C has the same parent of B\n * 3. append C, C has the different parent of B\n */\n public appendChild (newChild: TaroNode) {\n return this.insertBefore(newChild)\n }\n\n /**\n * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/replaceChild\n * @scenario\n * [A,B,C]\n * 1. replace B with C, C has no parent\n * 2. replace B with C, C has no parent, C has the same parent of B\n * 3. replace B with C, C has no parent, C has the different parent of B\n */\n public replaceChild (newChild: TaroNode, oldChild: TaroNode) {\n if (oldChild.parentNode !== this) return\n\n // Insert the newChild\n this.insertBefore(newChild, oldChild, true)\n\n // Destroy the oldChild\n // - cleanRef: true (Need to clean eventSource, because the oldChild was detached from the DOM tree)\n // - update: false (No need to update parent.childNodes, because replace will not cause the parent.childNodes being reordered)\n oldChild.remove({ doUpdate: false })\n\n return oldChild\n }\n\n /**\n * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/removeChild\n * @scenario\n * [A,B,C]\n * 1. remove A or B\n * 2. remove C\n */\n public removeChild<T extends TaroNode> (child: T, options: RemoveChildOptions = {}): T {\n const { cleanRef, doUpdate } = options\n\n if (cleanRef !== false && doUpdate !== false) {\n // appendChild/replaceChild/insertBefore 不应该触发\n // @Todo: 但其实如果 newChild 的父节点是另一颗子树的节点,应该是要触发的\n MutationObserver.record({\n type: MutationRecordType.CHILD_LIST,\n target: this,\n removedNodes: [child],\n nextSibling: child.nextSibling,\n previousSibling: child.previousSibling\n })\n }\n\n // Data Structure\n const index = this.findIndex(child)\n this.childNodes.splice(index, 1)\n child.parentNode = null\n\n // Set eventSource\n if (cleanRef !== false) {\n eventSource.removeNodeTree(child)\n }\n\n // Serialization\n if (this._root && doUpdate !== false) {\n this.updateChildNodes()\n }\n\n return child\n }\n\n public remove (options?: RemoveChildOptions) {\n this.parentNode?.removeChild(this, options)\n }\n\n public hasChildNodes () {\n return this.childNodes.length > 0\n }\n\n public enqueueUpdate (payload: UpdatePayload) {\n this._root?.enqueueUpdate(payload)\n }\n\n public get ownerDocument (): TaroDocument {\n return env.document\n }\n\n static extend (methodName: string, options: TFunc | Record<string, any>) {\n extend(TaroNode, methodName, options)\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node.js","sources":["../../src/dom/node.ts"],"sourcesContent":["import { ensure, hooks, Shortcuts } from '@tarojs/shared'\n\nimport { DOCUMENT_FRAGMENT } from '../constants'\nimport { MutationObserver, MutationRecordType } from '../dom-external/mutation-observer'\nimport env from '../env'\nimport { hydrate } from '../hydrate'\nimport { extend, incrementId, isComment } from '../utils'\nimport { eventSource } from './event-source'\nimport { TaroEventTarget } from './event-target'\nimport { NodeType } from './node_types'\n\nimport type { TFunc, UpdatePayload } from '../interface'\nimport type { TaroDocument } from './document'\nimport type { TaroElement } from './element'\nimport type { TaroRootElement } from './root'\n\ninterface RemoveChildOptions {\n cleanRef?: boolean\n doUpdate?: boolean\n}\n\nconst CHILDNODES = Shortcuts.Childnodes\nconst nodeId = incrementId()\n\nexport class TaroNode extends TaroEventTarget {\n public uid: string\n public sid: string\n public nodeType: NodeType\n public nodeName: string\n public parentNode: TaroNode | null = null\n public childNodes: TaroNode[] = []\n\n public constructor () {\n super()\n this.uid = '_' + nodeId() // dom 节点 id,开发者可修改\n this.sid = this.uid // dom 节点全局唯一 id,不可被修改\n eventSource.set(this.sid, this)\n }\n\n private hydrate = (node: TaroNode) => () => hydrate(node as TaroElement)\n\n private updateChildNodes (isClean?: boolean) {\n const cleanChildNodes = () => []\n const rerenderChildNodes = () => {\n const childNodes = this.childNodes.filter(node => !isComment(node))\n return childNodes.map(hydrate)\n }\n\n this.enqueueUpdate({\n path: `${this._path}.${CHILDNODES}`,\n value: isClean ? cleanChildNodes : rerenderChildNodes\n })\n }\n\n private updateSingleChild (index: number) {\n this.childNodes.forEach((child, childIndex) => {\n if (isComment(child)) return\n\n if (index && childIndex < index) return\n\n this.enqueueUpdate({\n path: child._path,\n value: this.hydrate(child)\n })\n })\n }\n\n public get _root (): TaroRootElement | null {\n return this.parentNode?._root || null\n }\n\n protected findIndex (refChild: TaroNode): number {\n const index = this.childNodes.indexOf(refChild)\n\n ensure(index !== -1, 'The node to be replaced is not a child of this node.')\n\n return index\n }\n\n public get _path (): string {\n const parentNode = this.parentNode\n\n if (parentNode) {\n // 计算路径时,先过滤掉 comment 节点\n const list = parentNode.childNodes.filter(node => !isComment(node))\n const indexOfNode = list.indexOf(this)\n const index = hooks.call('getPathIndex', indexOfNode)\n\n return `${parentNode._path}.${CHILDNODES}.${index}`\n }\n\n return ''\n }\n\n public get nextSibling (): TaroNode | null {\n const parentNode = this.parentNode\n return parentNode?.childNodes[parentNode.findIndex(this) + 1] || null\n }\n\n public get previousSibling (): TaroNode | null {\n const parentNode = this.parentNode\n return parentNode?.childNodes[parentNode.findIndex(this) - 1] || null\n }\n\n public get parentElement (): TaroElement | null {\n const parentNode = this.parentNode\n if (parentNode?.nodeType === NodeType.ELEMENT_NODE) {\n return parentNode as TaroElement\n }\n return null\n }\n\n public get firstChild (): TaroNode | null {\n return this.childNodes[0] || null\n }\n\n public get lastChild (): TaroNode | null {\n const childNodes = this.childNodes\n return childNodes[childNodes.length - 1] || null\n }\n\n /**\n * @textContent 目前只能置空子元素\n * @TODO 等待完整 innerHTML 实现\n */\n // eslint-disable-next-line accessor-pairs\n public set textContent (text: string) {\n const removedNodes = this.childNodes.slice()\n const addedNodes: TaroNode[] = []\n\n // Handle old children' data structure & ref\n while (this.firstChild) {\n this.removeChild(this.firstChild, { doUpdate: false })\n }\n\n if (text === '') {\n this.updateChildNodes(true)\n } else {\n const newText = env.document.createTextNode(text)\n addedNodes.push(newText)\n this.appendChild(newText)\n this.updateChildNodes()\n }\n\n // @Todo: appendChild 会多触发一次\n MutationObserver.record({\n type: MutationRecordType.CHILD_LIST,\n target: this,\n removedNodes,\n addedNodes\n })\n }\n\n /**\n * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/insertBefore\n * @scenario\n * [A,B,C]\n * 1. insert D before C, D has no parent\n * 2. insert D before C, D has the same parent of C\n * 3. insert D before C, D has the different parent of C\n */\n public insertBefore<T extends TaroNode> (newChild: T, refChild?: TaroNode | null, isReplace?: boolean): T {\n if (newChild.nodeName === DOCUMENT_FRAGMENT) {\n newChild.childNodes.reduceRight((previousValue, currentValue) => {\n this.insertBefore(currentValue, previousValue)\n return currentValue\n }, refChild)\n return newChild\n }\n\n // Parent release newChild\n // - cleanRef: false (No need to clean eventSource, because newChild is about to be inserted)\n // - update: true (Need to update parent.childNodes, because parent.childNodes is reordered)\n newChild.remove({ cleanRef: false })\n\n let index = 0\n // Data structure\n newChild.parentNode = this\n if (refChild) {\n // insertBefore & replaceChild\n index = this.findIndex(refChild)\n this.childNodes.splice(index, 0, newChild)\n } else {\n // appendChild\n this.childNodes.push(newChild)\n }\n\n const childNodesLength = this.childNodes.length\n // Serialization\n if (this._root) {\n if (!refChild) {\n // appendChild\n const isOnlyChild = childNodesLength === 1\n if (isOnlyChild) {\n this.updateChildNodes()\n } else {\n this.enqueueUpdate({\n path: newChild._path,\n value: this.hydrate(newChild)\n })\n }\n } else if (isReplace) {\n // replaceChild\n this.enqueueUpdate({\n path: newChild._path,\n value: this.hydrate(newChild)\n })\n } else {\n // insertBefore 有两种更新模式\n // 比方说有 A B C 三个节点,现在要在 C 前插入 D\n // 1. 插入 D,然后更新整个父节点的 childNodes 数组\n // setData({ cn: [A, B, D, C] })\n // 2. 插入 D,然后更新 D 以及 D 之后每个节点的数据\n // setData ({\n // cn.[2]: D,\n // cn.[3]: C,\n // })\n // 由于微信解析 ’cn.[2]‘ 这些路径的时候也需要消耗时间,\n // 所以根据 insertBefore 插入的位置来做不同的处理\n const mark = childNodesLength * 2 / 3\n if (mark > index) {\n // 如果 insertBefore 的位置在 childNodes 的 2/3 前,则为了避免解析路径消耗过多的时间,采用第一种方式\n this.updateChildNodes()\n } else {\n // 如果 insertBefore 的位置在 childNodes 的 2/3 之后,则采用第二种方式,避免 childNodes 的全量更新\n this.updateSingleChild(index)\n }\n }\n }\n\n MutationObserver.record({\n type: MutationRecordType.CHILD_LIST,\n target: this,\n addedNodes: [newChild],\n removedNodes: isReplace\n ? [refChild as TaroNode] /** replaceChild */\n : [],\n nextSibling: isReplace\n ? (refChild as TaroNode).nextSibling /** replaceChild */\n : (refChild || null), /** insertBefore & appendChild */\n previousSibling: newChild.previousSibling\n })\n\n return newChild\n }\n\n /**\n * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/appendChild\n * @scenario\n * [A,B,C]\n * 1. append C, C has no parent\n * 2. append C, C has the same parent of B\n * 3. append C, C has the different parent of B\n */\n public appendChild (newChild: TaroNode) {\n return this.insertBefore(newChild)\n }\n\n /**\n * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/replaceChild\n * @scenario\n * [A,B,C]\n * 1. replace B with C, C has no parent\n * 2. replace B with C, C has no parent, C has the same parent of B\n * 3. replace B with C, C has no parent, C has the different parent of B\n */\n public replaceChild (newChild: TaroNode, oldChild: TaroNode) {\n if (oldChild.parentNode !== this) return\n\n // Insert the newChild\n this.insertBefore(newChild, oldChild, true)\n\n // Destroy the oldChild\n // - cleanRef: true (Need to clean eventSource, because the oldChild was detached from the DOM tree)\n // - update: false (No need to update parent.childNodes, because replace will not cause the parent.childNodes being reordered)\n oldChild.remove({ doUpdate: false })\n\n return oldChild\n }\n\n /**\n * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/removeChild\n * @scenario\n * [A,B,C]\n * 1. remove A or B\n * 2. remove C\n */\n public removeChild<T extends TaroNode> (child: T, options: RemoveChildOptions = {}): T {\n const { cleanRef, doUpdate } = options\n\n if (cleanRef !== false && doUpdate !== false) {\n // appendChild/replaceChild/insertBefore 不应该触发\n // @Todo: 但其实如果 newChild 的父节点是另一颗子树的节点,应该是要触发的\n MutationObserver.record({\n type: MutationRecordType.CHILD_LIST,\n target: this,\n removedNodes: [child],\n nextSibling: child.nextSibling,\n previousSibling: child.previousSibling\n })\n }\n\n // Data Structure\n const index = this.findIndex(child)\n const isLastChild = index === this.childNodes.length -1\n const path = child._path\n this.childNodes.splice(index, 1)\n child.parentNode = null\n\n // Set eventSource\n if (cleanRef !== false) {\n eventSource.removeNodeTree(child)\n }\n\n // Serialization\n if (this._root && doUpdate !== false) {\n if (isLastChild) {\n this.enqueueUpdate({\n path,\n value: null\n })\n } else {\n this.updateChildNodes()\n }\n }\n\n return child\n }\n\n public remove (options?: RemoveChildOptions) {\n this.parentNode?.removeChild(this, options)\n }\n\n public hasChildNodes () {\n return this.childNodes.length > 0\n }\n\n public enqueueUpdate (payload: UpdatePayload) {\n this._root?.enqueueUpdate(payload)\n }\n\n public get ownerDocument (): TaroDocument {\n return env.document\n }\n\n static extend (methodName: string, options: TFunc | Record<string, any>) {\n extend(TaroNode, methodName, options)\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { TaroNode } from "../../dom/node.js";
2
- import { MutationRecord } from "../../record-32b054d8.js";
2
+ import { MutationRecord } from "../../record-613fd53e.js";
3
3
  type MutationCallback = (mutations: MutationRecord[]) => any;
4
4
  /**
5
5
  * @see https://dom.spec.whatwg.org/#dictdef-mutationobserverinit
@@ -1,5 +1,5 @@
1
1
  import { MutationObserverImpl, MutationCallback, MutationObserverInit } from "./implements.js";
2
- import { MutationRecord, MutationRecordType } from "../../record-32b054d8.js";
2
+ import { MutationRecord, MutationRecordType } from "../../record-613fd53e.js";
3
3
  import { TaroNode } from "../../dom/node.js";
4
4
  declare class MutationObserver {
5
5
  core: Pick<MutationObserverImpl, 'observe' | 'disconnect' | 'takeRecords'>;
@@ -14,7 +14,7 @@ interface MiniTextData {
14
14
  }
15
15
  type MiniData = MiniElementData | MiniTextData;
16
16
  type HydratedData = () => MiniData | MiniData[];
17
- type UpdatePayloadValue = string | boolean | HydratedData;
17
+ type UpdatePayloadValue = string | boolean | HydratedData | null;
18
18
  type DataTree = Record<string, UpdatePayloadValue | ReturnType<HydratedData>>;
19
19
  interface UpdatePayload {
20
20
  path: string;
@@ -78,7 +78,7 @@ interface MiniTextData {
78
78
  }
79
79
  type MiniData = MiniElementData | MiniTextData;
80
80
  type HydratedData = () => MiniData | MiniData[];
81
- type UpdatePayloadValue = string | boolean | HydratedData;
81
+ type UpdatePayloadValue = string | boolean | HydratedData | null;
82
82
  type DataTree = Record<string, UpdatePayloadValue | ReturnType<HydratedData>>;
83
83
  interface UpdatePayload {
84
84
  path: string;
package/dist/index.cjs.js CHANGED
@@ -829,6 +829,8 @@ class TaroNode extends TaroEventTarget {
829
829
  }
830
830
  // Data Structure
831
831
  const index = this.findIndex(child);
832
+ const isLastChild = index === this.childNodes.length - 1;
833
+ const path = child._path;
832
834
  this.childNodes.splice(index, 1);
833
835
  child.parentNode = null;
834
836
  // Set eventSource
@@ -837,7 +839,15 @@ class TaroNode extends TaroEventTarget {
837
839
  }
838
840
  // Serialization
839
841
  if (this._root && doUpdate !== false) {
840
- this.updateChildNodes();
842
+ if (isLastChild) {
843
+ this.enqueueUpdate({
844
+ path,
845
+ value: null
846
+ });
847
+ }
848
+ else {
849
+ this.updateChildNodes();
850
+ }
841
851
  }
842
852
  return child;
843
853
  }