什么是响应式,
实时监听数据变化
如何监听数据变化
使用Object.defineProperty函数可以检测到数据变化
具体步骤可自行实现
更改数据后,页面会立刻重新渲染吗?
vue更新DOM的操作是异步执行的,
只要侦听到数据变化,将开启一个异步队列,
如果一个数据被多次变更,那么只会被推入到队列中一次,这样可以避免不必要的计算和DOM操作。
如果想要更改数据后,才去渲染页面,改如何操作
使用vm.$nextTick或Vue.nextTick
该方法会在页面重新渲染,DOM更新后,立即执行该方法
注:页面渲染操作是异步执行的
vm.$nextTick或Vue.nextTick也可作为promise使用
回忆:事件(event loop事件环)【同步执行栈,异步队列(分为:宏队列,微队列)】
宏任务:setTimeout
vm.$nextTick和Vue.nextTick的区别
vm.$nextTick内部函数的this指向的是vue实例也就是定义的vm[const vm = new Vue()]
Vue.nextTick内部函数的this指向的是widow
$nextTick内部是如何实现的(原理)
页面渲染完成后立即执行,
立即执行就说明要越快越好,【注:宏任务慢,微任务快】
所有会让它先执行微任务,如果浏览器不支持微任务则执行宏任务;
微任务有哪些:Promise,MutationObserver[突变观察,vue源码内部创建假节点,然后让假节点稍微改动一下,然后触发方法执行函数]
宏任务:setTmmediate[IE浏览器下可能会执行该任务;该宏任务比setTimeout快一些] ,setTimeout
原理:
if(typeof Promise !== 'undefined'){
}else if(typeof MutationObserver !=="undefined"){
}else if(setTmmediate !=="undefined"){
}else{
//setTimeout
}
vue有些小问题
vue渲染的过程总是在等主线程执行同步任务完毕后再去执行异步任务,最后渲染,
假如该主线程执行同步任务的过程中有些问题卡在那了,
最终会导致页面卡在那不动了[因为主线程的同步任务报错了,一直卡在那,页面就不会渲染,就会导致页面卡死]
vue的小问题,就是不将主线程让出来,干等死等,不完使事就不渲染;
而react则不会,随时都不会把主线程让出来,只要有空就回去渲染
vue修改数据不能导致页面重新渲染
1、更改数组【原来的基础上更改数组】:
a:通过更改索引的方式更改数组
arr=["a","b":"c"]
vm.arr[3]="D";
b:更改长度
arr=["a","b":"c"]
vm.arr.length=0
2、对象增删
a:增加
obj={a:1,b:2}
vm.obj.c=3;
{{obj.c}}
b:删除
delete vm.obj.a;
vue 响应式更改数组数据
1、变异方法:push、//增加
splice、//截取
prop、
shift、
unshift、
sort、
reverse
2、vm.$set(要改谁,改什么,改成啥)或Vue.set()
arr=["a","b":"c"]
vm.$set(vm.arr,3,"d")
3、vm.$delete(要删除谁的值,删除哪个)
vm.$delete(vm.arr,3)
vue 响应式更改对象数据
2、vm.$set(要改谁,改什么,改成啥)或Vue.set()
obj={a:1,b:2}
vm.$set(vm.arr,"c","3")
3、vm.$delete(要删除谁的值,删除哪个)
vm.$delete(vm.arr,"c")