zwhu / blog

嘛,写 blog 也要遵守基本法。
MIT License
66 stars 2 forks source link

vdom(2) #41

Open zwhu opened 6 years ago

zwhu commented 6 years ago
let vdom = {
    tag: 'div',
    props: {
        style: 'display:none'
    },
    children: [{
        tag: 'a',
        props: {
            id: '1',
            href: 'http://test.com',
            target: '_blank'
        },
        children: ["click!"]
    }, 'this is text!!!', {
        tag: 'div',
        props: {
            class: 'class1 class2',
            'data-attr': 'hello'
        },
        children: ['haha', {
            tag: 'br'
        }]
    }, {
        tag: 'br'
    }]
}

function render(root) {

    function dfs(node) {
        let element
        if (node.tag) {
            element = createElement(node.tag, node.props)
            node.children && node.children.map(dfs).forEach(element.appendChild)
        } else if (typeof node === 'string')
            element = createTextNode(node)

        return element
    }
    return dfs(root)
}

function createElement(tag, props = {}) {
    const element = document.createElement(tag)
    Object.keys(props).forEach((key) => { element.setAttribute(key, props[key]) })
    return element
}

function createTextNode(text) {
    return document.createTextNode(text)
}

console.log(render(vdom))

运行结果如下:

运行结果