美文网首页
Vue源码(一)

Vue源码(一)

作者: 匿名信片 | 来源:发表于2017-08-23 10:27 被阅读0次

1、作者源码
实现一个简单的双向绑定

<!DOCTYPE html>
<html>
    <head>
        <title>ideal</title>
        <meta charset="utf-8">
    </head>
    <body>
        <div id="test">
            <p>{{msg}}</p>
            <p>{{msg}}</p>
            <p>{{msg}}</p>
            <p>{{what}}</p>
            <p>{{hey}}</p>
        </div>
        <script>
            var bindingMark = 'data-element-binding'    // 元素绑定标志
            function Element (id, initData) {

                var self     = this,
                    el       = self.el = document.getElementById(id)
                    bindings = {} // 内部副本
                    data     = self.data = {} // 外部接口
                    content  = el.innerHTML.replace(/\{\{(.*)\}\}/g, markToken)  // 匹配双括号,添加标志位,并将属性拷贝到内部副本

                el.innerHTML = content    // 用替换后的标签内容,生成新的dom树

                for (var variable in bindings) {
                    bind(variable)  // 数据绑定方法
                }

                if (initData) {
                    for (var variable in initData) {  // 进行赋值,只用这样才能用defineProperty监听属性变化
                        data[variable] = initData[variable]
                    }
                }

                function markToken (match, variable) {
                    bindings[variable] = {}
                    return '<span ' + bindingMark + '="' + variable +'"></span>'
                }

                function bind (variable) {
                    bindings[variable].els = el.querySelectorAll('[' + bindingMark + '="' + variable + '"]')
                    ;[].forEach.call(bindings[variable].els, function (e) {
                        e.removeAttribute(bindingMark)
                    })      // 获取页面数据绑定元素,并移除标志位
                    Object.defineProperty(data, variable, {    //  实行双向布局绑定
                        set: function (newVal) {
                            [].forEach.call(bindings[variable].els, function (e) {
                                bindings[variable].value = e.textContent = newVal
                            })
                        },
                        get: function () {
                            return bindings[variable].value
                        }
                    })
                }
            }
            
            var app = new Element('test', {
                msg: 'hello'
            })

        </script>
    </body>
</html>
···

相关文章

网友评论

      本文标题:Vue源码(一)

      本文链接:https://www.haomeiwen.com/subject/pyyldxtx.html