• 解vue的数据binding原理(转)


    <!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 type="text/javascript">
    //定义一个变量
    var bindingMark = 'data-element-binding'

    function Element(classa, initData) {
    console.log("this zhi");
    console.log(this);
    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];
    console.log("outerHTML")
    console.log(e.target.outerHTML);
    console.log("key: " + key);
    data[key] = e.target.value
    console.log(data.hey, data.msg);
    }
    </script>
    </body>
    </html>


    ------------------------------------
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title></title>
    </head>
    <body>
    <input type="text" id="aa"/>
    <span id="bb">{{hello}}</span>
    <script>
    var obj = {};
    Object.defineProperty(obj,'hello',{
    set:function(val){
    document.getElementById('bb').innerHTML = val;
    document.getElementById('aa').value = val;
    }
    });
    document.getElementById('aa').onkeyup = function(e){
    obj.hello = e.target.value;
    };
    obj.hello = "";
    </script>
    </body>
    </html>


    https://www.cnblogs.com/dh-dh/p/5606596.html

  • 相关阅读:
    node.js
    Ajax常见面试题
    CF932E Team Work
    斯特林数
    UOJ #62. 【UR #5】怎样跑得更快
    洛谷 P4593 【[TJOI2018]教科书般的亵渎】
    洛谷 P4321 【随机漫游】
    洛谷 P4707 【重返现世】
    洛谷 P3175 [HAOI2015]按位或
    CF Gym101933K King's Colors
  • 原文地址:https://www.cnblogs.com/geekjsp/p/9550172.html
Copyright © 2020-2023  润新知