vue的原理解析

可以从下图中看出

1、通过建立虚拟dom树document.createDocumentFragment(),方法创建虚拟dom树。
2、一旦被监测的数据改变,会通过Object.defineProperty定义的数据拦截,截取到数据的变化。
3、截取到的数据变化,从而通过订阅——发布者模式,触发Watcher(观察者),从而改变虚拟dom的中的具体数据。
4、最后,通过更新虚拟dom的元素值,从而改变最后渲染dom树的值,完成双向绑定
最后附上全部代码,简单实现了一下,可在线直接运行编辑
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>BFWJS DEMO PAGE</title>
</head>
<body>
<div id="mvvm">
<span>{{text}}</span>
<input v-model="d" id="test" />
<input type='button' v-click="go" value="提交" />
<div>
</div>
</div>
<script type="text/javascript">
var obj = {};
function nodeContainer(node, vm, flag) {
var flag = flag || document.createDocumentFragment();
var child;
while (child = node.firstChild) {
compile(child, vm);
flag.appendChild(child);
if (child.firstChild) {
nodeContainer(child, vm, flag);
}
}
return flag;
}
//编译
function compile(node, vm) {
var reg = /\{\{(.*)\}\}/g;
if (node.nodeType === 1) {
var attr = node.attributes;
//解析节点的属性
for (var i = 0; i < attr.length; i++) {
if (attr[i].nodeName == 'v-model') {
var name = attr[i].nodeValue;
node.addEventListener('input', function(e) {
vm[name] = e.target.value;
});
node.value = vm[name]; //讲实例中的data数据赋值给节点
node.removeAttribute('v-model');
}
if (attr[i].nodeName == 'v-click') {
...点击查看剩余70%
网友评论0