vue2的实现原理

260 阅读1分钟
  • vue2的虚拟dom是参考snabbdom.js这个库的,vue2的数据劫持是使用Object.defineProperty,当数据监听系统检测到数据发生改变时会通知虚拟DOM进行新老虚拟DOM对比并找出需要更新的虚拟DOM进行页面更新,这一个对比的过程叫做diff ,如果有循环渲染key是新老虚拟DOM对比的键,没有key或使用index作为key对比难度会提高,而且顺序发生改变时,会导致新老虚拟DOM匹配不上,容易导致页面发生错误。

  • 数据监听系统使用Object.defineProperty实现,在监听数据上并不完美,特别体现在数组上。基本数据类型能直接进行监听,如果是对象类型,vue会进行递归直至监听的类型是基本数据类型,数组上的元素并不是像对象中的属性可以进行递归处理,这一缺点体现在,数组一般不能通过索引直接修改数据。响应数据是数组时能直接调用push等改变自身的数组的方法,是因为vue2重写了响应数组原型上的方法

  • vue初始化时,vue会第一时间将data配置项的返回值进行数据监听,因此最好的做法是组件中使用的响应数据,在声明时就在data的返回值出现,如果没有出现直接使用vm。xxx = xxx(时机在组件初始化之后)在当前执行都并不能触发页面更新,但是回添加到vm的内存中,在下次触发vue响应式变化时才添加到vue的数据监听系统中