1. 程式人生 > >解vue的數據binding原理(轉)

解vue的數據binding原理(轉)

ctype obj bindings v-model type ech token each charset

<!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>




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

解vue的數據binding原理(轉)