IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Vue中computed原理 -> 正文阅读

[JavaScript知识库]Vue中computed原理

1.computed大致流程

computed是vue中的计算属性,在依赖的值发生变化的时候进行重新计算,否则使用缓存。

而在面试中常被问及computed原理,这篇文章主要作为我学习computed源码的笔记。

前面说到computed只有在依赖发生变化才会重新计算,那么如何得知computed的值发生了变化呢

这主要是Watcher中的dirty属性,dirty属性为true时,说明computed中的值需要重新计算,dirty为false时,则说明依赖没有变化,不需要重新计算

当计算属性的值发生变化时,计算属性的watcher和组件的watcher都会得到通知。

计算属性的watcher会将dirty置为true,组件的Watcher得到通知,同样将dirty属性置为false,重新计算值,用于本次渲染。

简单来说,computed就是定义在vm上的一个getter属性,这个getter属性被触发时会做两件事

1. 计算当前属性的值,此时会使用Watcher去观察计算属性中用到的所有其他数据的变化。同时将计算属性的Watcher的dirty属性设置为false.

2.当计算属性中用到的数据发生变化时,将得到通知从而进行重新渲染

Watcher中的depend和evaluate方法是专门用于实现计算属性的两个API

export default class Watcher {
     constructor(vm, expOrFn, cb, options) {
         if(options) {
             this.lazy = !!options.lazy;
         }  else {
             this.lazy = false;
         }
         this.dirty = this.lazy;
         this.value = this.lazy ? undefined : this.get()
     }
     evaluate() {
        this.value = this.get()
        this.dirty = false; 
    }
    depend() {
        let i = this.deps.length
        while(i--) {
            this.deps[i].depend()
        }
    }
}

执行depend方法可以将组件中的watcher实例添加到dep实例的依赖列表中。换句话说,this.deps是计算属性中用到的所有状态的dep实例,而依次执行了dep实例的depend方法就是将组件的watcher依次加入到这些dep实例的依赖列表。这就实现了让组件的watcher观察计算属性中用到的所有的状态的变化。

2.Computed逻辑变化

computed在vue2.5.2中的实现发生了一些变化,因为之前的computed的计算存在一些逻辑上的漏洞,因为只要依赖的值发生了变化,vue就认为值发生了变化,组件会重新走一遍渲染的流程,但实际上UI不会由变化,浪费了一些性能。

改动之后的逻辑:

组件的watcher不再监听计算属性的变化,而是让计算属性的watcher得到通知后,计算一次计算属性的值,如果发现这一次计算出来的值与上一次计算出来的值不一样,再去主动通知组件的watcher进行重新渲染。

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:23:40  更:2022-03-15 22:27:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:45:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码