Vue2 - computed 和 method 的原理区别

目录

  • 1,简单对比
  • 2,原理的不同
    • 1,method 的处理
    • 2,computed 的处理
      • 实现缓存
      • 触发更新
  • 3,触发更新时的问题

1,简单对比

  1. computed 当做属性使用,method 当做方法使用。
  2. computed 可以提供 getter 和 setter 来赋值。
  3. computed 无法接收多个参数。
  4. computed 有缓存。

2,原理的不同

1,method 的处理

处理比较简单,只需要遍历 methods 配置的每个属性,将其对应的函数通过 bind 绑定到当前实例。之后复制其引用到组件实例即可(为了通过 this 可访问)。

// 伪代码
function Vue(options) {
  // ...
  // 其他代码
  // ...
  Object.entries(options.methods).forEach(([methodName, fn]) => {
    this[methodName] = fn.bind(this);
  });
}

new Vue(vnode.componentOptions);

2,computed 的处理

在触发组件的生命周期函数 beforeCreate后,会做一系列的事情,其中包括对 computed 的处理:

  1. 遍历 computed 配置中的所有属性,对每个属性都创建一个 Watcher 对象,并传入一个函数。该函数本质上就是 computedgetter。之后 getter 触发时就会收集依赖。

数据响应式中 Watcher 原理参考。
简单来说,为了监听响应式数据的变化来触发更新,Vue 会将使用了响应式数据的函数(模板对应 render 函数)通过 Watcher 记录下来(收集依赖)。之后响应式数据发生变化,就会通知对应的 Watcher 来执行对应的函数触发更新。

  1. Watcher 创建好之后,vue 会使用代理模式,将计算属性挂载到组件实例上(为了通过 this 访问)。

  2. 不同于渲染函数 renderWatcher,为计算属性创建的 Watcher 不会立即执行。因为要考虑该计算属性是否被使用(渲染函数或其他方法中),没使用就不会执行。所以在创建 Watcher 时配置了一个 lazy 属性,lazy === trueWatcher 不会立即执行。

实现缓存

  1. 受到 lazy 的影响,Watcher 内部还会配置2个属性:valuedirty

    • value,保存 Watcher 运行时的结果,一开始(Watcher 还没有执行时)为 undefined
    • dirty,标记当前 value 是否过期,一开始为 true
  2. 当读取计算属性时,会先检查 dirty

    • true 时则运行之前传入 Watcher 的函数(也就是计算属性的 getter),将计算依赖得到的值保存在 Watchervalue 中,同时设置 dirty = false
    • false,则直接返回 Watcher.value,也就是缓存的值。

触发更新

  1. 为了实现更新,在收集依赖时,被依赖的数据不仅会收集计算属性的 Watcher还会收集组件的 Watcher

  2. 当计算属性变化时,会先触发计算属性的 Watcher,但只会将 dirty = true,其他不做处理。之后触发组件的 Watcher 重新渲染。render 函数(或模板)又读取了计算属性,因为dirty === true,所以会重新运行 getter 计算。

  3. 设置计算属性时比较简单,直接运行 setter 即可。

3,触发更新时的问题

注意到上面触发更新时,如果计算属性的依赖发生变化,但计算属性没有在模板(或render函数)中使用时(其他方法或watch场景同理),虽然会触发计算属性的 Watcher,但不会触发同时收集到的组件的 Watcher

举例:

<template>
  <div>
    <h1 v-if="showName">{{ fullName }}</h1>
    <button @click="handleClick">隐藏 fullName</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      firstName: '渣渣',
      lastName: '辉',
      showName: true
    }
  },
  computed: {
    fullName: {
      get() {
        return this.firstName + ' ' + this.lastName
      },
      set(newValue) {
        ;[this.firstName, this.lastName] = newValue.split(' ')
      }
    }
  },
  methods: {
    handleClick() {
      this.firstName = '123' // 计算属性依赖发生变化
      this.showName = !this.showName
    }
  },
  updated() {
    console.log(this)
  }
}
</script>

showName === false 所以不渲染 h1,所以render 函数不会读取计算属性 fullName

所以只会执行:

计算属性的依赖:
firstName: [计算属性的 Watcher,组件的 Watcher(对应render函数 )]
lastName: [计算属性的 Watcher,组件的 Watcher(对应render函数)]
showName: [组件的 Watcher]

动图展示


以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/296850.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring模块(二)IOC容器之BeanFactory

在Spring中实现控制反转的是IoC容器 &#xff08;1&#xff09;IoC 不是一种技术&#xff0c;只是一种思想&#xff0c;一个重要的面向对象编程的法则&#xff0c;它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象&#xff0c;从…

Spring Boot Admin健康检查引起的Spring Boot服务假死

问题现象 最近在spring boot项目中引入了 spring-boot-starter-actuator 后&#xff0c;测试环境开始出现服务假死的现象&#xff0c; 且这个问题十分怪异&#xff0c;只在多个微服务中的简称A的这个服务中出现&#xff0c;其他服务都没有出现这个问题&#xff0c; 之所以说…

爬取彼案壁纸

代码展现&#xff1a; 具体代码&#xff1a; import requests import re import os filename 壁纸\\ if not os.path.exists(filename): os.mkdir(filename) for i in range(2,11): url fhttp://www.netbian.com/index_{i}.htm headers {User-Agent: …

iOS实时查看App运行日志

目录 一、设备连接 二、使用克魔助手查看日志 三、过滤我们自己App的日志 &#x1f4dd; 摘要&#xff1a; 本文介绍了如何在iOS iPhone设备上实时查看输出在console控制台的日志。通过克魔助手工具&#xff0c;我们可以连接手机并方便地筛选我们自己App的日志。 &#x1f4…

CMake支持的编译平台和IDE

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 简介支持的IDEVisual…

vue3 鲜为人知的知识点

该篇文章是个人觉得在平常开发过程中没怎么注意到&#xff08;新增加&#xff09;的知识点&#xff0c;每个章节的内容在官网中不只文章提到的这些。 &#x1f495; 模板语法 ✔ 动态参数 <script setup> import { ref } from vueconst attributeName ref(msg) const …

[JavaWeb玩耍日记] 数据库

mysql版本&#xff1a;5.7.24 使用Navicat for MySQL辅助学习(2015年版)&#xff0c;这个在粘贴本博客的块引用内容时会有额外的不可见内容导致sql运行出问题&#xff0c;不过有影响的地方笔者已排除 目录 一.数据库创建 二.使用数据库与创建表 三.表内列的数据类型 四.修…

解决Android Studio The path ‘X:\XXX‘ does not belong to a directory.

目录 前言 一、问题描述 二、解决方法 前言 在移动应用开发领域&#xff0c;Android Studio作为一款功能强大的集成开发环境&#xff0c;为开发人员提供了丰富的工具和功能。然而&#xff0c;在使用Android Studio的过程中&#xff0c;有时也会遇到各种各样的问题和错误。 &…

SpringCloud微服务

微服务技术对比 DubboSpringCloudSpringCloudAlibaba注册中心zookeeper,RedisEureka、ConsulNacos、Eureka服务远程调用Dubbo协议Feign(http协议)Dubbo、Feign配置中心无SpringCloudConfigSpringCloudConfig,Nacos服务网关无SpringCloudGateway、ZuulSpringCloudGateway、Zuul…

西门子PLC联网数据采集:借助HiWoo Box实现高效监控与管理

在工业自动化领域&#xff0c;西门子PLC作为一种广泛应用的控制器&#xff0c;对于工厂的生产线具有至关重要的作用。如何实现西门子PLC的联网数据采集&#xff0c;提高生产效率和管理水平&#xff0c;成为了许多企业的关注焦点。而HiWoo Box作为一款功能强大的工业网关&#x…

STM32-03-STM32HAL库

文章目录 STM32HAL库1. HAL库介绍2. STM32Cube固件包3. HAL库框架结构4. 新建HAL版本MDK工程 STM32HAL库 1. HAL库介绍 HAL库 HAL&#xff0c;英文全称 Hardware Abstraction Layer&#xff0c;即硬件抽象层。HAL库是ST公司提供的外设驱动代码的驱动库&#xff0c;用户只需要调…

数字孪生在增强现实(AR)中的应用

数字孪生在增强现实&#xff08;Augmented Reality&#xff0c;AR&#xff09;中的应用可以提供更丰富、交互性更强的现实世界增强体验。以下是数字孪生在AR中的一些应用&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff…

性能优化-OpenMP概述(一)-宏观全面理解OpenMP

本文旨在从宏观角度来介绍OpenMP的原理、编程模型、以及在各个领域的应用、使用、希望读者能够从本文整体上了解OpenMP。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础…

添加jdk 11到环境变量的一种方法

添加jdk 11到环境变量的一种方法 1.jdk11可以直接在android studio 中下载&#xff0c; File --> Settings --> Build, Execution, Deployment --> Build Tools --> Gradle 下载jdk 11 &#xff0c;确认好下载路径 2.jdk11 添加到环境变量添加到环境变量 多个…

【AI视野·今日NLP 自然语言处理论文速览 第六十六期】Tue, 31 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 31 Oct 2023 (showing first 100 of 141 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers The Eval4NLP 2023 Shared Task on Prompting Large Language Models a…

日程安排小程序实战教程

日常中我们经常有一些事情需要提醒自己&#xff0c;使用日历的形式比较符合实际的使用习惯。本篇我们就利用微搭低代码工具带着大家开发一款日程安排的小程序。 1 创建数据源 登录微搭低代码控制台&#xff0c;打开数据模型&#xff0c;点击创建 输入数据源的名称日程安排 …

Erupt即开即用的后台管理系统【告别前端代码】

一、引子 【零前端代码&#xff0c;几行Java注解&#xff0c;搞定后台管理系统】 如果只是自己内部公司使用的话&#xff0c;大多数功能都可以满足&#xff0c;剩下的就是自己添砖加瓦了。 我用这个主要是简单快捷&#xff0c;10分钟搭建一个简易的后台管理系统。 二、基本…

【精通C语言】:深入解析C语言中的while循环

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; C语言详解 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、while循环1.1语法1.2 执行过程解析1.3 break1.4 continue &#x1f324;️全篇总结 &…

ssm基于vue.js的购物商场的设计与实现论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装购物商场软件来发挥其高效地信息处理的作用&#xff0c;可以…

Notepad++ v7.7.1 安装及添加插件

1、notepad_v7.7.1.zip npp.7.7.1.Installer.x64.exe npp.7.7.1.Installer.x86.exe notepad_v7.7.1.ziphttps://www.123pan.com/s/VTMXjv-X6H6v.html 2、notepad插件包_64bit_4.zip ComparePlugin ---->文件对比插件 ComparePlugin.dllNppFTP ---->FTP、FTPES和SFTP …