watch
watch监听对象,需要深度监听,但还是拿不到oldVal
watch:{
obj:{
handler(oldVal,val){
},
deep:true
},
info(oldVal,val){
}
}
v-for和v-if不能放在同一标签中使用。
v-model
v-model.trim="name"
v-model.lazy="name"
v-model.number="age"
@click
@click="add(2,$event)"
add(val,e){}
兄弟组件通讯
1、弄一个父组件
2、通过vuex
3、eventBus(事件车)
**第一步:创建一个js文件,eventBus.js**
import Vue from 'vue'
export default new Vue()
**第二步:在top组件中,引入刚才的js**
import event from '@/eventBus.js'
event.$emit('add',this.data);
**第三步:在left组件中也先让引入eventBus.js,然后使用created生命周期函数(要接受数据的组件)**
import event from '@/eventBus.js'
event.$on('add',(data)=>{});
自定义v-model
{{name}}
<input :value="name" @input="change($evevt.target.value)">
$nextTick
Vue是异步渲染框架
data改变之后,DOM不会立刻渲染
操作DOM,获取最新DOM应该用这个,页面渲染时会将data的修改做整合,多次修改data只会渲染一次
this.$nextTick(()=>{
})
vue动态组件
<component :is="组件名"/>
最常用的就是tab切换
异步引入组件
import name from ‘’;这种方式是同步引入的
components:{
AA:() => import('@/')
}
mixin
import myMixin from './mixin';
export default{
mixins:[myMixin]
}
Vue原理
function observe(target){
if(typeof target!=='object' || target===null){
return target
}
for(let key in target){
defineReactive(target,key,target[key])
}
}
function defineReactive(target,key,value){
observe(value);
Object.defineproperty(target,key,{
get(){
return value
},
set(newValue){
if(newValue !== value){
observe(newValue);
value = newValue
updateView();
}
}
})
}
function updateView(){
}
var data={
name:'张三',
age:'20岁',
sex:'男',
info:{
address:''
}
}
observe(data);
缺点:
1、深度监听,需要递归到底,一次性计算量大,如果数据很复杂,就会卡死
2、无法监听新增属性、删除属性(Vue.set Vue.delete)
如何监听数组的变化