免费做试卷的网站或试卷,网站源码在线下载,公司网站建设推合同,淘宝怎么做引流和推广概述
在使用时#xff0c;computed 当做属性使用#xff0c;而 methods 则当做方法调用computed 可以具有 getter 和 setter#xff0c;因此可以赋值#xff0c;而 methods 不行computed 无法接收多个参数#xff0c;而 methods 可以computed 具有缓存#xff0c;而 met…概述
在使用时computed 当做属性使用而 methods 则当做方法调用computed 可以具有 getter 和 setter因此可以赋值而 methods 不行computed 无法接收多个参数而 methods 可以computed 具有缓存而 methods 没有
详解
vue 对 methods 的处理比较简单只需要遍历 methods 配置中的每个属性方法将其对应的函数使用 bind 绑定当前组件实例后复制其引用到组件实例中即可。
而vue对computed的处理会稍微复杂一些。
当组件实例触发生命周期函数 beforeCreate 后它会遍历 computed 配置中的所有属性为每一个属性创建一个Watcheri对象并传入一个函数该函数的本质其实就是 computed 配置中的 getter这样一来getter 运行过程中就会收集依赖。
但是和渲染函数不同为计算属性创建的 Watcher 不会立即执行因为要考虑到该计算属性是否会被渲染函 数使用如果没有使用就不会得到执行。因此在创建 Watcher 的时候它使用了 lazy 配置lazy 配置可以让Watcher不会立即执行。
收到 lazy 的影响Watcher 内部会保存两个关键属性来实现缓存一个是value一个是 dirty。
value 属性用于保存 Watcher 运行的结果受 lazy 的影响该值在最开始是undefined。
dirty 属性用于指示当前的 value 是否已经过时了即是否为脏值受 1azy 的影响该值在最开始是 true。
Watchert 创建好后vue 会使用代理模式Object.defineProperty将计算属性挂载到组件实例中。当读取计算属性getter时vue 检查其对应的 Watcher 是否是脏值如果是则运行函数计算依赖并得到对应的值保存在 Watcher 的value中然后设置 dirty 为 false然后返回。
如果 dirty 为 false 则直接返回 value。 此外在依赖收集时被依赖的数据不仅会收集到计算属性的Watcher还会收集到组件的 Watcher。当计算属性的依赖变化时会先触发计算属性的 Watcher 执行此时它只需设置 dirty 为 true 即可不做任何处理。
由于依赖同时会收集到组件的 Watcher因此组件会重新渲染而重新渲染时又读取到了计算属性由于计 算属性目前已为 dirty因此会重新运行getter进行运算。
而对于计算属性的 setter则极其简单当设置计算属性时直接运行setter即可。