diff --git a/test/index.spec.js b/test/index.spec.js index 94eb243..8e9ddb6 100644 --- a/test/index.spec.js +++ b/test/index.spec.js @@ -1,4 +1,4 @@ -const { elementOpen, text, elementEnd, currentInfo } = require('../vdom/vnodeBack.js'); +const { elementOpen, text, elementEnd, currentInfo } = require('../vdom/vnode.js'); describe('idom', () => { test('校验idom结构', async () => { diff --git a/vdom/vnode.js b/vdom/vnode.js index 4839adb..9b8aa41 100644 --- a/vdom/vnode.js +++ b/vdom/vnode.js @@ -8,16 +8,65 @@ var currentInfo = { currentNode: null, currentParent: null } +let stack = []; +let currentNode = null; +let currentParent = null; + function elementOpen(tagName) { // TODO + let element = { + 'tagName': tagName + } + if (stack.length === 0) { + currentInfo.currentNode = element; + currentNode = null; + } + + currentParent = currentNode; + currentNode = element; + + if (currentParent) { + !currentParent.children ? currentParent.children = [element] : currentParent.children.push(element); + } + + stack.push(tagName); } function text(textContent) { // TODO + currentNode.text = textContent; } function elementEnd(tagName) { // TODO + if (stack[stack.length - 1] !== tagName) { + console.log('标签闭合错误'); + return; + } + + stack.pop(); + + currentNode = currentParent; + + if (currentInfo.currentNode) { + // 当期操作节点已经到顶层了,不需要计算父亲节点 + if (currentInfo.currentNode === currentNode) { + return; + } + + // 计算父亲节点 + let node = currentInfo.currentNode; + function findNode(curNode) { + for(let i = 0; i< curNode.children; i++) { + if(currentNode === curNode.children[i]) { + currentParent = curNode; + } else { + findNode(curNode.children[i]) + } + } + } + findNode(node); + } } module.exports = { elementOpen,