vue 计算属性未重新计算 / computed 未触发 / computed 原理源码分析

news2025/1/17 16:17:08

点击可打开demo
在这里插入图片描述
这里在一秒后改了数组里value属性的值在这里插入图片描述
虽然数据有更新,但打开控制台,可以发现computed函数只在初始化时执行了一次
在这里插入图片描述
按理说一秒后改变了value值,应该执行两次才对呀?
但如果computed属性这样写,明确写明展开了每一项,获取到了value属性,就能执行第二次
在这里插入图片描述
vue的文档里提到,计算属性的方法只应该有单纯的计算,不要产生其他效果,像我们上面的demo,虽然数据有更新,但console.log没打印,这里的console.log其实就算是文档里的side effects
在这里插入图片描述
为什么会有这种表现呢?

看看vue的源码吧!顺便学习一下computed是如何实现的!

这里先说整体思路
这里用了proxy,对所有响应式对象加proxy,这样就能改他们的get和set等方法,然后当读取计算属性时,执行computed里的方法,执行的时候,会读取到其依赖的响应式对象,因为之前改了他们的set方法,所以此时能知道读取的是哪个对象的什么属性,此时就能把他加到computed属性的依赖中。但依赖的值发生改变,因为用proxy改过其get方法,同时之前收集过依赖,知道这个依赖值被哪些值所依赖,就能去触发更改。
接着看实际实现
我们对变量设为响应式对象,会用ref方法,ref方法的实现中调用了toReactive在这里插入图片描述
toReactive调用了reactive在这里插入图片描述

reactive调用createReactiveObject,并把mutableHandlers传入了参数
在这里插入图片描述

createReactiveObject使用了proxy,把mutableHandlers作为proxy的handler
在这里插入图片描述

然后我们看看handler是怎么做的在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
可以看到当get时,即获取响应式对象值时,调用了track方法,这里就是在收集依赖了,当我们在computed方法获取响应式对象时,这个computed就作为了target传入去,现在看看track方法做了什么
在这里插入图片描述
这里是{target -> key -> dep}的两个map,target就是每一个响应式对象,key就是这个对象上的属性名,dep里就存放了依赖这个属性的响应式对象列表,可以看到下面trackEffects函数里,有一行dep.add(activeEffect)
在这里插入图片描述
这里的activeEffect就是当前在运行的响应式对象,就是computed计算属性,被加到dep里了。因此,在computed里用到的其他响应式对象,当computed被执行时,其他响应式对象对应属性里就会维护一个列表,列表里放的是依赖这个属性的响应式对象,依赖收集完成。
之后就是触发了
这里用proxy改了set方法,会去调用trigger函数

在这里插入图片描述
看看trigger函数如何实现在这里插入图片描述
trigger函数的target是改了值的响应式对象本身,key是更改的属性名,然后从刚刚说的{target -> key -> dep}两个map里,拿到依赖这个对象这个key的列表deps,这里还能看到如果改的是length,还会有额外操作,感兴趣的可以去看源码,在effect.ts文件。
之后就调用triggerEffects方法,参数其实就是deps,在这里插入图片描述

然后就会去调用triggerEffect(说实话,我还没看到为啥355和360行的代码要这样写),这里如果有scheduler就会去执行,这里的scheduler是构造函数的第二个参数在这里插入图片描述

能找到是在ComputedRefImpl的构造函数赋值的,这里会把dirty改为true,然后会调用triggerRefValue在这里插入图片描述
triggerRefValue有调用triggerEffects了,是不是很熟悉?没错是解决假设你的计算属性被其他计算属性所以的,就会继续triggerEffects下去在这里插入图片描述
那实际在哪里改变值呢?还记得刚刚把dirty改为true了吗?computed的实现了,get函数如果dirty为true,就会重新计算在这里插入图片描述
这样,computed就更新了。

看完源码,终于懂了!如果在计算属性里没有明确获取某个响应式对象的某个key,那改了这个key,是不会重新执行computed的,所以就会有开头demo的现象。

回到文档在这里插入图片描述

因此,如果我仍想要有side effects,又不肯换watchers,可以明确获取一下会改变的属性值。但要记住这个知识点,可能相比有side effects就用watchers更复杂吧?
除非代码很多,难得改🐶

有不懂欢迎评论,一起探讨

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据分析之大数据分析

一 什么是大数据分析 大数据是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。大数据的特点可以概括为5个V:数据量大&…

当湿度达到70蜂鸣器警报

1.编写设备树&#xff0c;添加蜂鸣器等设备 驱动代码&#xff1a; #include <linux/init.h> #include <linux/module.h> #include <linux/i2c.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/device.h> #include …

QCSPCChart for Java R3x0 Crack

Java 的 SPC 控制图工具 版本 3.04 QCSPCChart添加变量控制图&#xff08;X-Bar R、X-Bar Sigma、Individual Range、Median Range、EWMA、MA、MAMR、MAMS 和 CuSum 图&#xff09;、属性控制图&#xff08;p-、np-、c-、u- 和DPMO 图&#xff09;、频率直方图和 Pareto 图到…

[附源码]Python计算机毕业设计Django的旅游景点管理系统的设计与实现

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

[附源码]Python计算机毕业设计SSM老年公寓管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

计算机编程

文章目录计算机编程计算机编程语言计算机编程 人与人之间信息&#xff08;如想法、思想等&#xff09;的交流和传递&#xff0c;需要借助双方都能听得懂的语言。人和计算机之间实现交流也是如此&#xff0c;需要借助一种人和计算机都能理解的语言&#xff0c;这种语言称为编程…

LCHub低代码社区:旧的低代码,腾讯怎么讲出新故事

腾讯微搭的对手从来都不是钉钉。 低代码是 " 旧瓶装新酒 " 吗? 低代码风潮在国内兴盛已有两年,但也并不是已经被所有人接受,有不少开发者还保有否定、抵触的态度。 那为什么我们还认为这是一个不可逆的趋势呢? 这里先看下被否定的原因,LCHub在调研中听到的主…

怎么把PDF转换成图片?这三种转换方法都可以实现

怎么把PDF文件的内容转换成图片来使用呢&#xff1f;大家在办公或者是学习的过程中没少使用过PDF文件&#xff0c;有的文件我们翻阅起来会比较费时间&#xff0c;因为文件的内容多&#xff0c;这时候我们只需要把文件内容转成图片就可以解决这一问题&#xff0c;想要使用哪部分…

手把手带你开发你的第一个前端脚手架

开发一个简单的脚手架 1.创建 npm 项目 首先创建一个文件夹&#xff0c;然后进入到该文件夹目录下&#xff0c;执行 npm init -y 2.创建脚手架入口文件bin/index.js&#xff0c;在index.js中添加如下代码 #!/usr/bin/env nodeconsole.log(hello cli) 3.配置 package.json&a…

YOLOv5如何训练自己的数据集

目录 一、标注 1.1 标注软件下载labelimg 下载地址&#xff1a;mirrors / tzutalin / labelimg GitCode 1.2 json转txt 1.3 xml转txt 二、修改配置文件 2.1 建立文件目录 2.2 修改wzry_parameter.yaml文件 三、开始训练 3.1 2.结果 四、识别检测detect.py 1.调参找…

Jetson NX系统烧录以及CUDA、cudnn、pytorch等环境的安装

安装虚拟机和Ubuntu18.04环境 这两步比较简单&#xff0c;所以略了。虚拟机的配置需要注意硬盘空间大一点&#xff0c;至少40G。 安装sdk-manager NVIDIA SDK Manager下载地址&#xff1a;https://developer.nvidia.com/drive/sdk-manager sudo dpkg -i sdkmanager_1.9.0-…

YOLOv5和YOLOv7环境(GPU)搭建测试成功

本来是用doc写的&#xff0c;直接复制到这里很多图片加载缓慢&#xff0c;我直接把doc上传到资源里面了&#xff0c;0积分下载&#xff1a; (10条消息) YOLOv5和YOLOv7开发环境搭建和demo运行-Python文档类资源-CSDN文库 一、环境搭建 1.1 环境搭建参考链接 YOLO实践应用之…

uni-app 超详细教程(一)(从菜鸟到大佬)

一&#xff0c;uni-app 介绍 &#xff1a; 官方网页 uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、Web&#xff08;响应式&#xff09;、以及各种小程序&#xff08;微信/支付宝/百度/头条/飞书/QQ/快手…

百度集团副总裁吴甜发布文心大模型最新升级,AI应用步入新阶段

11月30日&#xff0c;由深度学习技术与应用国家工程研究中心主办、百度飞桨承办的WAVE SUMMIT2022深度学习开发者峰会如期举行。百度集团副总裁、深度学习技术及应用国家工程研究中心副主任吴甜带来了文心大模型的最新升级&#xff0c;包括新增11个大模型&#xff0c;大模型总量…

PyQt5_寻找顶(底)背离并可视化

技术指标的背离是指技术指标曲线的波动方向与价格曲线的趋势方向不一致&#xff0c;是使用技术指标最为重要的一点。在股市中&#xff0c;常见的技术指标的背离分为两种常见的形式&#xff0c;即顶背离和底背离。背离是预示市场走势即将见顶或者见底的依据&#xff0c;在价格还…

计算机组成原理习题课第四章-1(唐朔飞)

计算机组成原理习题课第四章-1&#xff08;唐朔飞&#xff09; ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&…

k8s部署手册

一、基础配置 1.修改主机名 hostnamectl set-hostname k8s-master01 hostnamectl set-hostname k8s-master02 hostnamectl set-hostname k8s-master03 hostnamectl set-hostname k8s-node01 hostnamectl set-hostname k8s-node022.添加 主机名与IP地址解析 cat > /etc/hos…

LINUX安装openssl

openssl 官网下载 https://www.openssl.org/source/old/ 1、解压openssl包&#xff1a; tar -xzf openssl-1.1.1n.tar.gz2、得到openssl-1.1.1n目录&#xff0c;然后进入openssl-1.1.1n目录中&#xff0c;安装openssl到 /usr/local/openssl 目录&#xff0c;安装之后&#xff…

[附源码]Python计算机毕业设计SSM联动共享汽车管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

如何在 SwiftUI 中创建条形图

条形图以矩形条的形式呈现数据的类别,其宽度和高度与它们表示的值成比例。本文将展示如何创建一个垂直条形图,其中矩形的高度将代表每个类别的值。 系列文章 如何在 SwiftUI 中创建条形图SwiftUI 中的水平条形图在 iOS 16 中用 SwiftUI Charts 创建一个折线图在 iOS16 中用 …