赞
踩
理解:
核心点:Object.defineProperty
默认vue在初始化数据时,利用es5的 Object.defineProperty重新定义vue实例中的所有属性,当页面取到对应属性时,会进行依赖收集(收集当前组件的watcher)如果属性发生变化会通知相应的依赖更新操作。
首先明确数组并没有使用Object.defineProperty去重新定义数组的每一项,它是使用函数劫持的方式,重写了数组的方法。vue将data中的数组进行原型链的重写,指向了自己定义的数组原型方法,这样当调用数组返回api时,可以通知依赖更新,如果数组中包含着引用类型,会对数组中的引用类型再次进行监控。
Vue 的生命周期指的是组件从创建到销毁的一系列的过程,被称为 Vue 的生命周期。通过提供的 Vue 在生命周期各个阶段的钩子函数,我们可以很好的在 Vue 的各个生命阶段实现一些操作。
当我们使用 keep-alive 的时候,还有两个钩子函数,分别是 activated 和 deactivated 。用 keep-alive 包裹的组件在切换时不会进行销毁,而是缓存到内存中并执行 deactivated 钩子函数,命中缓存渲染后会执行 actived 钩子函数。
在created的时候,视图的dom并没有渲染出来,所以此时如果直接去操作dom节点,并没有办法找到。
在mounted中,由于此时dom已经渲染出来了,所以可以直接操作dom,一般情况下都放在mounted中,保证逻辑的统一性,因为生命周期是同步执行的,而ajax是异步执行的。但是由于服务端渲染不支持mounted方法,因此在服务端渲染的情况下统一放到created中。
父子组件间通信
第一种方法是子组件通过 props 属性来接受父组件的数据,然后父组件在子组件上注册监听事件,子组件通过 emit 触发事件来向父组件发送数据。
第二种是通过 ref 属性给子组件设置一个名字。父组件通过 $refs 组件名来获得子组件,子组件通过 $parent 获得父组件,这样也可以实现通信。
兄弟组件间通信
第一种是使用 eventBus 的方法,它的本质是通过创建一个空的 Vue 实例来作为消息传递的对象,通信的组件引入这个实例,通信的组件通过在这个实例上监听和触发事件,来实现消息的传递。
第二种是通过 $parent.$refs 来获取到兄弟组件,也可以进行通信。
任意组件之间
使用 eventBus ,其实就是创建一个事件中心,相当于中转站,可以用它来传递事件和接收事件。
如果业务逻辑复杂,很多组件之间需要同时处理一些公共的数据,这个时候采用上面这一些方法可能不利于项目的维护。这个时候可以使用 vuex ,vuex 的思想就是将这一些公共的数据抽离出来,将它作为一个全局的变量来管理,然后其他组件就可以对这个
公共数据进行读写操作,这样达到了解耦的目的。
v-if每次切换都会重新渲染dom节点,也就是往dom树增添或者删除节点,具有较高的切换性能消耗。而v-if实际上只是改变dom节点的样式的display,具有较高的初次渲染性能消耗。
虚拟dom首先对我们将要插入到文档中的 DOM 树结构进行分析,使用 js 对象将其表示出来,比如一个元素对象,包含 TagName、props 和 Children 这些属性。然后我们将这个 js 对象树给保存下来,最后再将 DOM 片段插入到文档中。
当页面的状态发生改变,我们需要对页面的 DOM 的结构进行调整的时候,我们首先根据变更的状态,重新构建起一棵对象树,然后将这棵新的对象树和旧的对象树进行比较,记录下两棵树的的差异。
最后将记录的有差异的地方应用到真正的 DOM 树中去,这样视图就更新了。
两个树的完全 diff 算法的时间复杂度为 O(n^3) ,但是在前端中,我们很少会跨层级的移动元素,所以我们只需要比较同一层级的元素进行比较,这样就可以将算法的时间复杂度降低为 O(n)。
算法首先会对新旧两棵树进行一个深度优先的遍历,这样每个节点都会有一个序号。在深度遍历的时候,每遍历到一个节点,我们就将这个节点和新的树中的节点进行比较,如果有差异,则将这个差异记录到一个对象中。
在对列表元素进行对比的时候,由于 TagName 是重复的,所以我们不能使用这个来对比。我们需要给每一个子节点加上一个 key,列表对比的时候使用 key 来进行比较,这样我们才能够复用老的 DOM 树上的节点。
引用链接:
《做面试的不倒翁:浅谈 Vue 中 computed 实现原理》 https://juejin.im/post/5b98c4da6fb9a05d353c5fd7
《Virtual DOM》https://juejin.im/book/5bdc715fe51d454e755f75ef/section/5bdc72e6e51d45054f664dbf
《vue 生命周期深入》 https://juejin.im/entry/5aee8fbb518825671952308c
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。