1.什么是变化检测?当组件中的状态发生变化时,Vue自然会知道状态发生了变化,并根据状态生成DOM进行渲染。通常,应用程序运行时,内部状态是不断变化的,那么如何知道哪些状态发生了变化呢?变更检测(也叫数据绑定?)就是为了解决这个问题。与React和Angular的“拉”方式不同,Vue属于“推”方式。当state发生变化时,Vue会立即知道,并且知道哪些状态发生了变化。如果有许多依赖项绑定到状态名称,则每个依赖项都是一个DOM节点。当名称发生变化时,Vue会向依赖名称的所有依赖发送通知,让DOM节点执行更新操作。但是,这样做会产生一定的成本。如果每个状态都绑定了很多依赖,每次更新操作依赖跟踪的开销会非常高。因此,Vue从2.0开始就引入了虚拟DOM。每个状态绑定的依赖不再是某个DOM节点,而是一个组件。当状态改变时,可以通知组件,组件内部使用虚拟DOM。比较。2、怎么知道数据变了?如何检测数据变化?嗯,其实大家都知道,那就是使用强大的Object.defineProperty和ES6Proxy。只是ES6目前在浏览器中的兼容性并不理想。到目前为止,Vue还是使用Object.defineProperty来实现(游达说以后会用Proxy重写,不过没关系,原理是一样的)。然后,尝试封装一个函数:){if(val===newVal)returnval=newVal}})}defineReactive翻译过来就是定义一个响应式类型,这已经很直白了,好切?每当从obj中读取key属性时,就会触发get函数;每当为obj的关键属性设置数据时3.依赖性是什么?如果只定义了defineReactive,那是没用的(反手给我两杠)棕榈)。我们用劫持的思维来想一想,我们能不能在get和set函数中做点什么?答案是:must~must~举个糖炒的例子:初始化的时候,那么必然会触发get函数;在给name赋值的时候,必然会触发set函数。现在,在get函数中收集依赖,在set函数中通知依赖,然后尝试定义一个Dep类:letid=0functionDep(){this.id=id++this.subs=[]}Dep。prototype.addSub=functionaddSub(sub){this.subs.push(sub)}Dep.prototype.depend=functiondepend(){if(Dep.target){Dep.target.addDep(this)}Dep.prototype。notify=functionnotify(){constsubs=this.subs.slice()for(leti=0;i
