当 Vue 实例中的 data 发生变化时,Vue 会自动触发重新渲染视图的过程。具体的流程如下
数据响应式:Vue通过使用Object.defineProperty或Proxy来劫持data对象的属性,使其变成响应式的。当data中的属性发生变化时,Vue能够监听到这些变化。
触发响应式系统:并且通过dep收集依赖,改变后循环通知所有dep手机的watch 进行更新
模板编译:Vue会将模板编译成渲染函数。在编译过程中,Vue会解析模板中的指令、插值表达式等,并生成对应的渲染函数。
虚拟DOM生成:渲染函数执行后,会生成虚拟DOM(Virtual DOM)。虚拟DOM是一个轻量级的JavaScript对象,它描述了真实DOM的结构和属性。
更新虚拟DOM:当data发生变化时,Vue会重新执行渲染函数,生成新的虚拟DOM。
对比更新:Vue会将新旧虚拟DOM进行对比,找出差异。这个过程称为虚拟DOM Diff算法。
执行更新钩子函数:在更新视图之前和之后,Vue 会执行一些生命周期钩子函数,例如 beforeUpdate 和 updated。这些钩子函数可以让开发者在数据更新前后执行一些自定义的逻辑。
更新子组件:如果当前组件包含子组件,Vue 会递归地更新子组件的视图,从而保证整个组件树的数据和视图都是同步的。
触发 watch 和 computed:如果当前组件中定义了 watch 或 computed 属性,Vue 会在数据更新后自动触发这些属性的回调函数,从而实现数据的响应式更新。
批量更新:Vue会将需要更新的差异进行批量处理,最小化对真实DOM的操作。vue会每隔一定时间进行一次更新操作
真实DOM更新:最后,Vue会将更新后的虚拟DOM渲染到真实的DOM上,完成页面的渲染。
总的来说,Vue通过数据响应式、模板编译、虚拟DOM和差异对比等机制,实现了从数据变化到页面渲染的自动化过程。这样,开发者只需要关注数据的变化,而不需要手动操作DOM,提高了开发效率。