生命周期函数(父子)顺序
父beforeCreate =>. 父created ==>. 父beforeMount ==> 子beforeCreate ==> 子created ==> 子beforeMount ==> 子mounted ==> 父mounted
更新顺序
父beforeUpdate ==> 子beforeUpdate ==> 子updated ==> 父updated
卸载顺序
父beforeDestory / 子beforeDestory / 子destroyed / 父destroyed
vue2自定义 v-model
props: ['text'] model: { prop: 'text', event: 'change' } :value @input="$emit('change')"
v-if(存在DOM销毁和创建,可以有多个互斥的分支)和v-show(使用 display: none 来控制是否显示)
v-html 会有XSS 风险,会覆盖 children 里面的内容
watch 深度监听一个对象,拿不到 oldvalue,因为是引用
v-for和v-if 不要在一个标签上面使用(在vue3上 v-if的优先级高于 v-for)
事件对象 $event 是原生的mouseEvent对象 和 react 不同 $event.target 是注册到的 div / @click定义的位置 $event.currentTarget 事件被注册到当前的元素,react是注册到 root 标签上的 但是 vue 不是 vue是异步渲染的,data修改之后 DOM不会立即渲染,多次 data修改做整合,只会触发渲染一次 但是可以在 $nextTick 中获取最新的DOM slot 插槽 作用域插槽(使用子组件中的 data) 具名插槽(有名称) 动态组件 <component. :is='name'. /> vue2只需要 名称, vue3必须是 一个具体的组件变量 异步组件 components: { FormDemo: () => import(.....) } 用到的时候才会去 加载对应的 js 文件,减小打包体积,提高性能 keepalive 用于频繁切换(常见性能优化) 缓存组件,不需要重复渲染
mixin的问题
变量来源不清晰,不利于阅读,重名(当有多个的时候), 功能不能有效拆分
组件和mixin 可能出现多对多的现象 mixinMounted 先执行 mounted 后执行
组件化:并不是新出现的。 后端原本就有 <%include. 文件。 %>
MVVM: 数据驱动视图,不需要修改DOM,只关注于业务逻辑
vue的响应式,自动触发视图更新
proxy 兼容性不好,且无法 poly fill defineProperty 的缺点 无法监听到新属性 / 下标 的 值,同样也无法 删除,无法监听原声数组,需要特殊处理 需要使用Vue.set / delete 复杂对象需要开始深度监听 (递归操作),而且在赋值时也要 深度监听(在 runtime 时执行),计算量大
vdom 核心减少计算次数的难度, 计算出最小的变更,然后执行DOM操作 { tag: 'div', props: { id: 'div1' }, children: [ ] } 使用JS来模拟DOM的结构 snabbdom 学习 vdom h / patch 函数 h 函数接受 vdom得出vnode, patch函数负责 挂载/更新/卸载 新旧vnode对比,得出最小更新范围,最后更新DOM tag都可以有 key 属性 patchVnode / addVnode / removeVnode updateChildren key的重要性 diff 算法 是vdom中最核心,最关键的部分 并不是 vdom 独创的,如 Linux diff 比较2个JS对象也可以做 diff 库 jiff
树的时间复杂度为 O(n^3) 1000个节点,需要计算1000^3次 怎么办 优化时间复杂度到 O(n) ,怎么实现 1.只比较同一层级,不跨级比较 2.tag不相同,则直接删除重建,不再深度比较 3.tag和key相同,二者都相同,则认为是相同节点 日常中大多数就是同级比较
编译模板
vue template complier 将模板编译为 render 函数 执行 render 函数生成 vnode with 要慎用,它打破了作用域规则,易读性变差 vue-loader 会在开发环境下编译模板 vue组建中使用render函数代替template
组件渲染更新过程
- 初次渲染过程
- 更新过程
标签:vue,DOM,event,面试,组件,data,监听 From: https://www.cnblogs.com/escapist/p/18061424