<body>
<script src='https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js'></script>
<div id='myApp'>
<!-- 数据绑定: vue对象的data字段中的数据显示到模板中 一般通过以下两种语法实现-->
<!-- 1, 通过{{}}语法渲染数据 -->
<h1>{{count}}</h1>
<!-- 2, 通过v-text属性(指令)或v-html属性渲染, 注意属性中不加{{}} -->
<h1 v-text="friend.name"></h1>
<h1 v-html="div"></h1>
<!-- {{}}中属于js运行环境,可以实现简单的逻辑运算和函数调用 -->
<h1>{{Math.floor(height)}}</h1>
<h1>{{height + 10}}</h1>
<h1>{{height > 180? '高富帅' : '矮矬穷'}}</h1>
<!-- {{}}中不能执行复杂的函数定义, 循环, 判断结构 -->
<!-- <h1>{{function add(a,b){alert(a+b)};add(3,4)}}</h1> -->
<!-- <h1>{{if(1!=2){console.log(123)}}}</h1> -->
<!-- 以上实现了data数据向标签模板上的绑定, 也叫单向数据绑定 -->
<!-- 表单上的数据绑定叫双向数据绑定: 使用v-model实现, data中的数据可以显示到表单中,表单数据变化是, data数据同步更新 -->
<input type="text" v-model="friend.name">
<!-- 数据更新: 通过vue绑定的数据一旦变化, 视图中相关标签会同步刷新 -->
<button v-on:click="add">+</button>
</div>
<script>
new Vue({
el: '#myApp',
data: {
height: 156.82,
count: 1,
friend: {name: "小明"},
div: `<div>你<hr>好</div>`
},
methods: {
add(){
this.count++
// vue数据绑定的原理: 在data这个对象定义字段时, vue内部是通过js对象语法Object.defineProperty实现了这个属性字段的定义(参考2021.08.23第三个课件), 其中实现了属性的set赋值和get取值函数, 当vue模板中使用{{count}}渲染数据,会调用count的get函数获取字段值,替换掉{{count}}, 当调用this.count赋值更新时,会调用count的set函数更新count值, vue在set函数中, 找到了count相关的DOM标签,更新了相关标签的内容显示
}
},
// created 是vue对象的创建函数, vue对象创建完成会自动调用这个函数
created() {
console.log("vue对象已创建")
// 模拟vue底层对count字段的创建, 渲染和更新原理
Object.defineProperty(this.$data, "count", {
set(newValue){
this.tempValue = newValue;
// 在执行了count修改时,除了更新count值, 还需要刷新DOM, vue底层通过虚拟dom遍历查找到{{count}}所在的标签, 假设是myH1, 然后正对行的更新这个DOM标签内容即可
// myH1.innerText = this.value
},
get(){
console.log(this.tempValue)
// 遍历整个vue模板, 查找{{count}}这个结构, vue中有一套高效的DOM查找对比方式叫 虚拟DOM , 假设找到{{count}}所在的标签为 myH1 = <h1>{{count}}</h1>
// myH1.innerText = this.tempValue
if(this.tempValue){
return this.tempValue
}else{
return 1;
}
}
})
},
})
</script>
</body>