基本使用
vue2 的响应式原理
- Object.defineProperty
const data = {};
const name = 'zhooson'
Object.defineProperty(data, 'name' {
get: function(){
return name
},
set: function(val){
name = val
}
})
// 测试
console.info(3, data.name)
data.name = "zhangsan"
缺点: 无法监听 新增属性/删除属性(vue.set/vue.delete)
vue 的生命周期
beforeCreate
- 创建一个空白 vue 实例,
- data method 尚未初始化, 不可使用
created
- vue 实例初始化完成,完成响应式绑定
- data method 初始化完成, 可调用
- 尚未开始渲染模版
- beforeMount
- 编辑模版,调用 render 生成 vdom
- 还没有开始渲染 dom
- mounted
- 完成 dom 渲染
- 组件创建完成
- 开始由“创建阶段”进入“运行阶段”
- beforeUpdate
- data 发生变化
- 准备更新 dom(尚未更新)
- updated
- data 发生变化, dom 更新为完成
- beformUnMount
- 组件即将进入销毁阶段(还未销毁)
- 移除绑定自定义事件,全局事件
- unMounted
- 组件销毁完成
vue 是么时候操作 dom 最合适?
- mounted 和 updated 都不能保证子组件全部挂载完
- $nextTick 保证
Ajax 应该在哪个生命周期?
- mounted / created
vue2/vue3/react diff 算法有何区别?
vue2 双端比较
vue3 最长递增序列比较
react 仅右移
vue 中 如何监听组件报错?
- errorCaputred 组件生命周期
- window.error
组件的通讯
- props emit
- eventbus
- vuex
- event 自定义事件(重新初始化 new vue())
自定义的 v-model
<template>
<input type="text" :value="text" @change="$emit('change', $event.target.value )"/>
</template>
<script>
export default {
model: {
prop: 'text', // 对应 props text
event: 'change'
},
props : {
text: String,
default: () => {
return ''
}
}
}
</script>
- 自定义的 组件
{
{
name;
}
}
<CustomModel v-model="name" />;
$nextTick
1. vue是异步渲染
2. data改变之后,dom不会立即渲染
3. $nextTick在dom渲染后触发, 已获取最新的dom节点
代码验证: todolist 后的 添加 push 的数据,然后的直接获取 dom 的节点, dom 节点还是未获取
slot 插槽
<slot name="zhooson"></slot>
动态 组件
<component :is="[componentname]" ></component>
异步组件
export default {
components: {
form: () => import('./form.vue');
}
}
缓存组件
keep-alive
vue3 比 vue2 的 diff 带来哪些变化
- vue2 updateChildren 双端比较
- vue3 updateChildren 增加了“最长递增子序列”(更快)
- vue3 还增加了 patchFlag,静态提升,函数缓存等
