vue3使用以下三个步骤来建立响应数据:
vue2 vue3
beforeCreate -> setup()
Created -> setup()
beforeMount -> onBeforeMount
mounted -> onMounted
beforeUpdate -> onBeforeUpdate
updated -> onUpdated
beforeDestroyed -> onBeforeUnmount
destroyed -> onUnmounted
activated -> onActivated
deactivated -> onDeactivated
vue2是选项式API: data,computed,methods等;
data() { return {}; }, methods:{ }
vue3是组合式API:数据和⽅法都定义在setup中,并统⼀进⾏return{}
vue3:setup(props,context){ console.log(‘props’,props)return{} }
vue2:this.$emit()
vue3:setup(props,context){context.emit()}
vue2:diff算法遍历每一个虚拟节点,进行虚拟节点对比,并返回一个patch对象,用来存储两个节点不同的地方。用patch记录的消息去更新dom。缺点:比较每一个节点,而对于一些不参与更新的元素,进行比较是有点消耗性能的。
vue3:在初始化的时候会给每一个虚拟节点添加一个patchFlags,是一种优化的标识,只会比较patchFlags发生变化的节点,进行视图更新,而对于patchFlags没有变化的元素作静态标记,在渲染的时候直接使用。
//子组件:
<div>
<slot></slot>
</div>
//父组件:
<child>
<span>我是插槽插入的内容</span>
</child>
vue2:具名插槽
//子组件:
<div>
<slot name="person"></slot>
</div>
//父组件:
<child>
<span slot="person">插槽插入的内容</span>
</child>
vue2:作用域插槽:父组件模板的所有代码都在父级作用域内编译;子组件模板的所有代码都在子级作用域内编译。可以在父组件中使用slot-scope 特性从子组件获取数据。
<div>
<slot :data="data"></slot>
</div>
//父组件:
<child>
<span slot-scope="data">插槽插入的内容</span>
</child>
vue3:匿名插槽和vue2一样。
具名插槽:使用v-slot:
//子组件:
<div>
<slot name="person"></slot>
</div>
//父组件:
<child>
<template v-slot:person>
<span>插槽插入的内容</span>
</template>
</child>
vue3作用域插槽:
//子组件:
<div>
<slot :data="data"></slot>
</div>
//父组件:
<child>
<span #data>插槽插入的内容</span> 或者 <span #default="{data}">插槽插入的内容</span>
</child>
总结:
具名插槽使用方式不同:vue2使用slot=‘’,vue3使用v-slot:‘’
作用域插槽使用方式不同:vue2中在父组件中使用slot-scope=“data"从子组件获取数据,vue3中在父组件中使用 #data 或者 #default=”{data}"获取。
vue2
/deep/ 样式名{}
::v-deep 样式名{}
vue3
:deep (样式名{})
::v-deep(样式名{})