从头实现一个简易版的React虚拟dom和diff算法

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8" />
    <title>从头实现一个简易版的React虚拟dom和diff算法</title>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
</head>

<body>
    <div id="root"></div>
    <script>
    //虚拟dom
    function Element(tagName, props, children) {
        this.tagName = tagName
        this.props = props || {};
        this.children = children;
    }

    Element.prototype.render = function() {
        var el = document.createElement(this.tagName)
        var props = this.props

        for (var propName in props) {
            var propValue = props[propName]
            el.setAttribute(propName, propValue)
        }

        var childEl = document.createTextNode(this.children);
        el.appendChild(childEl)

        return el
    }

    //diff算法
    function diff(oldTree, newTree) {
        var patches = {}
        var propsPatches = {}
        var oldProps = oldTree.props
        var newProps = newTree.props
        for (key in oldProps) {
            value = oldProps[key]
            if (newProps[key] !== value) {
                propsPatches[key] = newProps[key]
            }
        }
        patches.props = propsPatches;
        return patches
    }

    //更新到页面上
    function patch(node, patches) {
        for (let prop in patches.props) {
            node.setAttribute(prop, patches.props[prop]);
        }
    }

    let tree = new Element('div', { 'data-msg': 'xu' }, 'xu');
    let html = tree.render();
    $('#root').html(html);

    let index = 0;
    setInterval(function() {
        index = index + 1;
        var newTree = new Element('div', { 'data-msg': 'xu' + index }, 'xu');
        var patches = diff(tree, newTree)
        console.log(patches)
        patch(html, patches)
        tree = newTree
    }, 1000)
    </script>
</body>

</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐同保

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值