通过snabbdom实现虚拟DOM

在前端页面中,我们都知道渲染DOM节点的代价是最大的,所以有了虚拟DOM大放异彩的机会,

js原生或者是Jquery框架时代,都是直接操作DOM节点来进行渲染页面,可是这样的代价确实是很大,需要将原本的DOM全部清除,然后在重新渲染一遍

github上面可以去看snabbdom的源码 https://github.com/snabbdom/snabbdom

上面也给出了案列,怎么去实现虚拟dom的应用

下面通过使用snabbdom来实现虚拟DOM,vue2.0中的虚拟dom就是通过snabbdom实现的

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <!--首先要应用snabbdom的js 要不然下面使用的参数 方法是获取不到的-->
        <script src="https://cdn.bootcss.com/snabbdom/0.7.1/snabbdom.js"></script>
        <script src="https://cdn.bootcss.com/snabbdom/0.7.1/snabbdom-class.js"></script>
        <script src="https://cdn.bootcss.com/snabbdom/0.7.1/snabbdom-props.js"></script>
        <script src="https://cdn.bootcss.com/snabbdom/0.7.1/snabbdom-style.js"></script>
        <script src="https://cdn.bootcss.com/snabbdom/0.7.1/snabbdom-eventlisteners.js"></script>
        <script src="https://cdn.bootcss.com/snabbdom/0.7.1/h.js"></script>
        
    </head>
    <body>
        <div id="container">
            
        </div>
        <button id='c_button'>change</button>
        <script type="text/javascript">
            var snabbdom = window.snabbdom;
            
            //定义patch函数 实现dom节点更新的核心方法
            var patch = snabbdom.init([
                snabbdom_class,
                snabbdom_props,
                snabbdom_style,
                snabbdom_eventlisteners
            ]);
            
            var h = snabbdom.h;        //定义h函数
            
            var container = document.getElementById('container');  //获取页面原始的DOM节点
            // 新建一个虚拟dom  通过h函数建立虚拟dom的
            var vnode = h('ul#list',{},[
                h('ul.item',{},'item1'),
                h('ul.item',{},'item2')
            ]);
            
            patch(container,vnode);        //第一次渲染,vnode去替换container节点内容
            
            document.getElementById('c_button').addEventListener('click',function(){
                var newNode = h('ul#list',{},[
                    h('ul.item',{},'item1'),
                    h('ul.item',{},'itemC'),
                    h('ul.item',{},'itemB')
                ]);
                patch(vnode,newNode);        //新的虚拟dom 替换之前的dom元素,只会修改发生变化的dom
            })
        </script>
    </body>
</html>

vnode的页面效果图

替换成newNode之后的效果图

猜你喜欢

转载自blog.csdn.net/w123452222/article/details/81780668