反应式原理是Vue.js的核心特性之一,数据驱动视图,我们修改数据视图来响应更新,非常优雅。Vue2.x使用Object.defineProperty()来实现,而Vue3.x使用Proxy来实现。我们先看看2.x的实现。Object.defineProperty(obj,key,{enumerable:true,configurable:true,get:functiongetter(){returnobj[key];},set:functionsetter(newVal){...}})我们传递Object.defineProperty为对象obj添加属性,可以设置对象属性的getter和setter函数。之后,我们每次通过点语法获取一个属性时,都会执行这里的getter函数。在这个函数中,我们会将调用这个属性的依赖收集到一个集合中;当我们为属性赋值时,这个定义就会被触发。setter函数,在辅助函数中,会通知集合中的依赖进行更新,这样数据的变化就可以带动视图的变化。3.x的核心思想和2.x一样,只是使用Proxy代替Object.defineProperty进行数据劫持,但是Proxy在处理数组和响应式处理新属性时比Object.defineProperty更方便.letnObj=newProxy(obj,{get:function(target,propKey,receiver){console.log(`getting${propKey}!`);returnReflect.get(target,propKey,receiver);},设置:function(target,propKey,value,receiver){console.log(`setting${propKey}!`);returnReflect.set(target,propKey,value,receiver);}})Vue响应式实现细节原理相信大部分人都熟悉,这里不再赘述。双向数据绑定双向数据绑定一般是指我们使用的v-model指令的实现。它是Vue的一个特性,也可以说是输入事件和值的语法糖。Vue通过v-model指令为组件添加输入事件处理和值属性赋值。
