1. 程式人生 > >詳解vue的數據binding原理

詳解vue的數據binding原理

meta length tex head mod ole return att self.

請看原文:

草席兩個頁面:

<!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 = {} //內部暫存綁定數據及dom data = self.data = {} //存儲bingding數據並實現監控 content = el.innerHTML.replace(/\{\{(.*)\}\}/g, markToken) el.innerHTML = content
for (var variable in bindings) { bind(variable); //將每個數據的名稱比如‘msg‘綁定到data } if (initData) { for (var variable in initData) { data[variable] = initData[variable] } } function markToken (match, variable) { bindings[variable] = {} //bindings裏存儲了數據來源的字段比如bindings[‘msg‘] return <span + bindingMark + =" + variable +"></span> } function bind (variable) { bindings[variable].els = el.querySelectorAll([ + bindingMark + =" + variable + "])//bindings裏再存儲msg綁定的元素 ;[].forEach.call(bindings[variable].els, function (e) { //刪除data-element-binding屬性 e.removeAttribute(bindingMark) }) Object.defineProperty(data, variable, { //es5觀察屬性 set: function (newVal) { [].forEach.call(bindings[variable].els, function (e) { bindings[variable].value = e.textContent = newVal //=>這裏才是實現的綁定,更新數據到dom並更新內部暫存數據 }) }, get: function () { return bindings[variable].value //取數據僅僅是內部暫存的數據 } }) } } var app = new Element(test, { msg: hello, what: hi }) </script> </body> </html>


<!DOCTYPE html>
<html>
    <head>
        <title>ideal</title>
        <meta charset="utf-8">
    </head>
    <body>
        <input class="test" type="text" name="asd" onkeyup ="handleChange()" v-model="hey">
        <input class="test" type="" name="" onkeyup ="handleChange()" v-model="msg">
        <script>
            var bindingMark = data-element-binding
            function Element (classa, initData) {
                var self     = this,
                    el          = self.el = document.getElementsByClassName(classa),//多個input改為class
                    bindings = {} 
                    data      = self.data = {} 
                    for (var i = 0; i < el.length; i++) {
                        content  = el[i].outerHTML.replace(/v-model=\"(.*)\"/g, markToken);
                        el[i].outerHTML = content
                    }
                for (var variable in bindings) {
                    bind(variable); 
                }
                if (initData) {
                    for (var variable in initData) {
                        data[variable] = initData[variable]
                    }
                }
                function markToken (match, variable) {
                    bindings[variable] = {} 
                    return  bindingMark + =" + variable +" //內填一個span變為只改它的元素
                }
                function bind (variable) {

                    bindings[variable].els = document.querySelectorAll([ + bindingMark + =" + variable + "])//document獲取binding元素
                    ;
                    Object.defineProperty(data, variable, { 
                        set: function (newVal) {
                            [].forEach.call(bindings[variable].els, function (e) {
                                bindings[variable].value = e.value = newVal //=>textContent改為input的value
                            })
                        },
                        get: function () {
                            return bindings[variable].value 
                        }
                    })
                }
            }
            
            var app = new Element(test, {
                msg: hello,
                hey:aaa
            })
            function handleChange(e){ //增加v=>m的綁定
                e = e || window.event
                var key = e.target.outerHTML.match(/data-element-binding=\"(.*)\"/)[1];
                data[key] = e.target.value
                console.log(data.hey,data.msg);
            }
        </script>
    </body>
</html>

詳解vue的數據binding原理