const reg_var = / \ {\ {(. +?) \} \} /;
class MVVM{
constructor(el, data) {
this.el = document.querySelector(el);
this._data = data;
this.domPool = {}
this.init()
}
init() {
this.initData();
this.initDom()
}
initDom() {
this.bindDom(this.el)
this.bindInput(this.el)
}
bindDom(el) {
const childNodes = el.childNodes;
childNodes.forEach(item= > {
if (item.nodeType === 3) {
const _value = item.nodeValue;
if (_value.trim().length) {
let _isValid = reg_var.test(_value)
if (_isValid) {
const _key = _value.match(reg_var)[1].trim();
this.domPool[_key] = item.parentNode;
item.parentNode.innerHTML = this.data[_key] || undefined
}
}
}
item.childNodes && this.bindDom(item)
})
}
bindInput(el) {
const _allInputs = el.querySelectorAll('input')
_allInputs.forEach(input= > {
const _vModel = input.getAttribute('v-model')
if (_vModel) {
input.addEventListener('keyup'.this.handleInput.bind(this,_vModel,input),false)}}}handleInput(key, input) {
const _value = input.value
this.data[key] = _value
}
initData() {
const that = this
this.data = {};
for (let key in this._data) {
Object.defineProperty(this.data, key, {
get() {
return that._data[key]
},
set(newVal) {
that.domPool[key].innerHTML = newVal
that._data[key] = newVal
}
})
}
}
}
DefineProperty * 2. Input -> Input /keyup -> Binding of event handlers -> Change data * 3. Related DOM -> data => bound together * a property that manipulates data => corresponding to DOM changes */
Copy the code