【vue】computed和methods的区别

666 阅读2分钟

这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战

computedmethods有什么区别?首先,在使用时,computed当做属性用,而methods当做方法调用。其次,computed可以具有gettersetter,因此可以复制,而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值是否已经过时了,即是否为脏值,如果是,则运行函数,计算依赖,并得到对应的值,保存在watchervalue中,然后设置dirty为false,然后返回。
如果dirty为false,则直接返回watcher的value。
要注意的是,在依赖收集时,被依赖的数据不仅会收到计算属性的wathcher,还会收集到组件的watcher
当计算属性的依赖变化时,会先触发计算属性的watcher执行,此时,它只需设置dirty为ture即可,不做任何处理。
由于依赖同时会收集到组件的watcher,因此,组件会重新渲染,而重新渲染又读取到了计算属性,由于计算属性目前已为dirty,因此会重新运行getter进行运算。