Vue是渐进式的js框架,也是一个MVVM的js框架 。
所谓渐进式就是他的使用方式,用到什么功能,只需要引入声明功能模块就可以了。这些功能是相互独立的。
下图为vue的所有部件
- 视图层传达指令到controller
- controller完成业务逻辑之后,要求model改变状态
- model将新的数据,发送到视图层,用户的到反馈
- 在ViewModel当中会有一个叫 Binder的东西,当ViewModel对Model进行更新的时候,Binder会自动把数据更新到View上 去;当用户对View进行操作(例如表单输入),Binder也会自动的把数据更新到Model上去。这种方式称为:Two-way data-binding,双向数据绑定。
问题:model层数据变化的时候,为什么vm就可以知道数据发送了变化啊?
- 即让你回答:vue的双向数据绑定的原理?
- vue在创建vm的时候,会将数据配置到实例中,然后通过Object.defineproperty的方法,为数据动态添加getter和setter方法,当获取数据的时候,会触发getter方法,当设置数据的时候,会触发setter方法,当setter方法触发完成时,会进一步触发watcher,当数据改变,视图更新完毕。
- 他的底层逻辑就是.:
- 先设置一个全局变量,当他获取对象属性的时候走get方法,get方法返回这个全局变量,当他设置对象属性的时候走set方法,set方法接收一个val值,将val赋值给全局变量,当他再次获取对象属性的时候调用get,get返回全局变量,值就改变了
let obj = {}
let middel = 100
Object.defineProperty(obj,"msg",{ //给那个对象添加,添加什么属性,配置项 写方法
get(){
console.log("get方法执行")
return middel
},
set(val){
console.log("set方法执行",val)
middel = val
}
})
console.log(obj.msg);// 获取对象属性的时候,调用get 100
obj.msg = 1111// 设置对象属性的时候,调用set //set执行了,1111
console.log(obj.msg); //1111
var vm = new Vue({
el:"#app",//是一个挂载点 将vue实例具体运用到哪一个DOM元素上
data:{ //我们需要vue帮我们管理的数据
msg:"hello world"
}
})
- 11111
//首先创建一个vue实例
var vm = new Vue({
el:"#app",
data:{
},
method:{
clickul(){
alert("这个ul被点击了")
},
clickli(){
alert("这个li被点击了")
}
}
})
- 由于 JavaScript 的限制,Vue 不能检测以下数组的变动:
- 当你利用索引直接设置一个数组项时,例如:vm.items[indexOfItem] = newValue
- vue.set(目标,索引,新的值)
- vm.items.splice(索引,替换/删除的长度,新的值)
- 当你修改数组的长度时,例如:vm.items.length = newLength
- vm.items.splice(newLength)
div id="app">
- {{item}}
{{user}}
//创建一个实例
var vm = new Vue({
el:"#app",//挂载
data:{
arr:[1,2,3],
user:{
name:"张三"
}
}
})
vm.arr.push(4)//我们更改的数据以后,视图会自动更新 在页面中显示1.2.3.4
vm.arr[2] = 30 //这样根据下标改值不可以
Vue.set(vm.arr,2,30) //1-1
vm.arr.splice(2,1,300) //1-2
vm.arr.length = 2 //这样修改数组长度不可以
vm.arr.splice(2) //这样可以 ,当这个方法传一个值表示数组的长度
//后续给一个对象添加一个新的属性。如果视图也想同时渲染最新的属性。那么要通过vue.set()方法
Vue.set(vm.user,"gander","男")//可以直接动态添加 参数1:目标 参数2:要添加的key 参数三:要添加的value
给添加按钮绑定一个方法,方法写在methods里面,方法里一个对象,获取到我们输入的值,然后将他push到data里面,然后通过个体tbody里的tr绑定 v-for="(product,index) in products" ,在通过product.属性,将他添加到表格中, 给按钮绑定点击事件,等于一个方法,方法里面写逻辑。
v-bind:class="{red:!product.is_shelf} 改变他的类名 当他不是true的时候为red这个类名