-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathVue.js
73 lines (65 loc) · 2.13 KB
/
Vue.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import Observer from "./Observer.js";
import Compile from "./Compile.js";
class Vue{
constructor(options) {
// 在vm中加入$el属性,挂载模版
if (this.isElement(options.el)) {
this.$el = options.el;
} else {
this.$el = document.querySelector(options.el);
}
// console.log(this.$el.childNodes);
// 在vm中加入$data属性,挂载数据
this.$data = options.data;
if (this.$el) {
// 数据劫持 - 拦截data所有属性的get/set
new Observer(this.$data);
// 模版解析 - 解析Vue指令
new Compile(this);
}
}
/**
* 判断是否是一个DOM元素
*/
isElement(node) {
return node.nodeType === 1;
}
}
/**
* HTML模版解析 - 替换DOM
* @param element Vue实例内挂载的元素
* @param vm Vue实例
* @constructor
*/
// function Compile(element, vm) {
// // 在vm中加入$el属性,挂载元素
// vm.$el = document.querySelector(element);
// // document.createDocumentFragment() 创建文档碎片
// const fragment = document.createDocumentFragment();
// console.log(vm.$el.childNodes); // 第五张log图片
//
// // 我们需要将这些子节点按序加入到文档碎片中,这样app-div中就没有元素渲染了
// // let child;
// // while (child = vm.$el.firstChild) {
// // fragment.append(child);
// // }
// //
// // fragment_compile(fragment);
// //
// // // 替换文档碎片内容
// // function fragment_compile(node) {
// // // 双向绑定匹配的正则表达式
// // const pattern = /\{\{\s*(\S+)\s*\}\}/
// // // 我们要替换的内容都是元素节点内容为3的元素
// // if (node.nodeType === 3) {
// // // 若是文本元素的模版,就进行模版解析
// // return;
// // }
// //
// // // 若不是文本元素的模版,就继续遍历节点
// // node.childNodes.forEach(child => {
// // fragment_compile(child);
// // })
// // }
// }
export default Vue;