下面只是一个最简单的类源码,主要便于理解vue 如何进行模板解析。
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta
name="viewport"
content="width=device-width, initial-scale=1.0"
>
<title>Document</title>
</head>
<body>
<div id="app">{{msg}}
<h3>{{str}}</h3>
</div>
<script src="./vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
msg: 'hello world',
str: 'hello',
}
})
</script>
</body>
</html>
vue.js
class Vue {
constructor(options) {
this.$el = document.querySelector(options.el);
this.$data = options.data;
this.compile(this.$el);
}
compile(node) {
if (node.childNodes && node.childNodes.length) {
node.childNodes.forEach((child) => {
// nodeType 1: 元素节点 3: 文本节点
if (child.nodeType === 3) {
// 文本节点
let reg = /\{\{(.*)\}\}/;
let text = child.textContent;
// 给节点赋值
child.textContent = text.replace(reg, (matched, value) => {
value = value.trim();
return this.$data[value];
});
} else {
// 元素节点
this.compile(child);
}
});
}
}
}