v-show是通过控制css的display属性来实现显示和隐藏
v-if是通过控制dom层面的渲染和销毁,而不是显示和隐藏
频繁切换显示状态使用v-show,否则使用v-if
必须用key,且不能是index和random,对于每一个元素,key值必须唯一
在diff算法中,需要通过判断tag和key值相同来判断两个节点是否是相同的节点
这样可以减少渲染次数,提升渲染性能
beforeCreate created
beforeMount mounted
beforeUpdate updated
beforeDestory destoryed
父子组件通信:父传子通过props,子传父通过this.$emit
兄弟组件通信(或者两个没有层级关系的组件通信):
通过自定义事件的方式通信
event.$on(绑定事件)
event.$emit(触发事件)
Vuex进行全局数据通信
1.input元素的value对应data中的this.name
2.绑定input事件,每次发生input事件,this.name=$event.target.value
3.data更新触发re-render
整个mvvm模型分为三部分,分别是model(数据层),viewmodel(视图模型),view(视图层),viewmodel是组件,通过数据的变化来驱动视图的更新,即通过model的改变来触发view的改变。
当我们定义一个组件,本质上是定义了一个class
在不同的地方去引用组件,实际上是创了了这个class的不同的实例
如果data不是函数,那么不同实例中的数据就会互相影响干扰
而如果data是函数,那么这些数据就处在一个闭包之中,不同组件实例你改你的,我改我的,互不影响。
ajax请求应该放在mounted中,也就是dom加载完成以后
js是单线程的,ajax异步获取数据
如果放在mounted之前没有用,dom没有渲染完,数据也不能够显示,这样做会使得逻辑混乱
使用$props
<子组件 v-bind="$props"/>
使用mixin
1.加载大组件
2.路由异步加载
缓存组件,不需要重复渲染
解除自定义事件:event.$off
清除定时器
解绑自定义的dom事件,如window scroll等
如果不进行上述操作,会造成内存泄漏
<父组件>
<子组件>
{{mySlot.myobj.name}}
<子组件/>
<父组件/>
//子组件
action中可以处理异步,mutation不可以
mutation做原子操作
action可以整合多个mutation
hash模式
H5 history模式(需要服务端的支持)
const router=new VueRouter({
routes:[
{
path:'/',
component:()=>import(./components/xxx)
},
{
path:'/next',
component:()=>import(./components/yyy)
}
]
});
//dom结构
xxx
- aaa
//用vnode方式描述
{
tag:'div',
props:{
id:div1,
class:container
},
children:[
{
tag:'p',
children:[
'xxx'
]
},
{
tag:'ul',
props:{
style:'font-size:20px'
},
children[
{
tag:'li',
children:['aaa']
}
]
}
]
}
object.defineProperty
O(n)
const data ={};
const name="张三";
Object.defineProperty(data,name,{
get:function(name){
console.log(get);
return name;
},
set:function(newval){
name=newval;
updateview();
}
})
只在同一层进行比较,不跨级比较
如果tag不同,直接删除重建,不进行深度比较
当tag和key都相同,判定二者是相同的节点,不再深度比较
合理使用v-show和v-if
合理使用computed
使用v-for时加key
自定义事件,DOM事件及时销毁
合理使用异步组件
合理使用keep-alive