广州做网站建设,网站开发怎么使用维语,西安免费建网站制作,国外免费ip地址面试题#xff1a;computed和methods有什么区别 标准而浅显的回答 在使用时#xff0c;computed当做属性使用#xff0c;而methods则当做方法调用computed可以具有getter和setter#xff0c;因此可以赋值#xff0c;而methods不行computed无法接收多个参数#xff0c;而m… 面试题computed和methods有什么区别 标准而浅显的回答 在使用时computed当做属性使用而methods则当做方法调用computed可以具有getter和setter因此可以赋值而methods不行computed无法接收多个参数而methods可以computed具有缓存而methods没有 更接近底层原理的回答 vue对methods的处理比较简单只需要遍历methods配置中的每个属性将其对应的函数使用bind绑定当前组件实例后复制其引用到组件实例中即可 而vue对computed的处理会稍微复杂一些。 当组件实例触发生命周期函数beforeCreate后它会做一系列事情其中就包括对computed的处理 它会遍历computed配置中的所有属性为每一个属性创建一个Watcher对象并传入一个函数该函数的本质其实就是computed配置中的getter这样一来getter运行过程中就会收集依赖 但是和渲染函数不同为计算属性创建的Watcher不会立即执行因为要考虑到该计算属性是否会被渲染函数使用如果没有使用就不会得到执行。因此在创建Watcher的时候它使用了lazy配置lazy配置可以让Watcher不会立即执行。 收到lazy的影响Watcher内部会保存两个关键属性来实现缓存一个是value一个是dirty value属性用于保存Watcher运行的结果受lazy的影响该值在最开始是undefined dirty属性用于指示当前的value是否已经过时了即是否为脏值受lazy的影响该值在最开始是true Watcher创建好后vue会使用代理模式将计算属性挂载到组件实例中 当读取计算属性时vue检查其对应的Watcher是否是脏值如果是则运行函数计算依赖并得到对应的值保存在Watcher的value中然后设置dirty为false然后返回。 如果dirty为false则直接返回watcher的value 巧妙的是在依赖收集时被依赖的数据不仅会收集到计算属性的Watcher还会收集到组件的Watcher 当计算属性的依赖变化时会先触发计算属性的Watcher执行此时它只需设置dirty为true即可不做任何处理。 由于依赖同时会收集到组件的Watcher因此组件会重新渲染而重新渲染时又读取到了计算属性由于计算属性目前已为dirty因此会重新运行getter进行运算 而对于计算属性的setter则极其简单当设置计算属性时直接运行setter即可