当前位置: 首页 > news >正文

南京市城市建设档案馆网站东莞网站建设市场

南京市城市建设档案馆网站,东莞网站建设市场,页面设计布局有哪些,b2c电子商务网站建设方案【Vue3源码】第六章 computed的实现 上一章节我们实现了 ref 及其它配套的isRef、unRef 和 proxyRefs API。这一章开始实现computed计算属性。 认识computed 接受一个 getter 函数,返回一个只读的响应式 ref 对象。该 ref 通过 .value 暴露 getter 函数的返回值。…

【Vue3源码】第六章 computed的实现

上一章节我们实现了 ref 及其它配套的isRef、unRef 和 proxyRefs API。这一章开始实现computed计算属性。

认识computed

接受一个 getter 函数,返回一个只读的响应式 ref 对象。该 ref 通过 .value 暴露 getter 函数的返回值。它也可以接受一个带有 getset 函数的对象来创建一个可写的 ref 对象。

computed计算属性最重要的功能就是:仅会在其响应式依赖更新时才重新计算。

为什么需要缓存呢?想象一下我们有一个非常耗性能的计算属性 list,需要循环一个巨大的数组并做许多计算逻辑,并且可能也有其他计算属性依赖于 list。没有缓存的话,我们会重复执行非常多次 list 的 getter,然而这实际上没有必要!如果你确定不需要缓存,那么也可以使用方法调用。

单元测试代码

首先看单元测试代码:

我们需要实现懒计算(响应式依赖更新时才重新计算)

所以我们测试内容主要需要实现的步骤有以下三步:

  • 当getter作为参数传入computed时,不会触发计算
  • 当访问计算属性的返回值cValue会被触发一次,响应式依赖如果不进行更新,重复访问时不会再次触发计算
  • 响应式依赖更新时才重新计算
import { computed } from "../computed";
import { reactive } from "../reactive";describe("computed", () => {it("happy path", () => {const value = reactive({foo: 1,});const getter = computed(() => {return value.foo;});value.foo = 2;expect(getter.value).toBe(2);});it("should compute lazily", () => {const value = reactive({foo: 1,});const getter = jest.fn(() => {return value.foo;});const cValue = computed(getter);// lazyexpect(getter).not.toHaveBeenCalled();expect(cValue.value).toBe(1);expect(getter).toHaveBeenCalledTimes(1);// should not compute againcValue.value;expect(getter).toHaveBeenCalledTimes(1);// should not compute until neededvalue.foo = 2;expect(getter).toHaveBeenCalledTimes(1);// now it should computeexpect(cValue.value).toBe(2);expect(getter).toHaveBeenCalledTimes(2);// should not compute againcValue.value;expect(getter).toHaveBeenCalledTimes(2);});
});

实现代码

计算属性是基于现有响应式对象而衍生出来的,它的实现代码中就有创建ReactiveEffect对象的流程。

computedRefImpl类是computed API的核心。

从ReactiveEffect的构造方法和计算属性创建ReactiveEffect对象源码可知,构造函数的fn回调方法就是getter方法,而schedule方法就是设置计算属性为脏数据的匿名方法。

import { ReactiveEffect } from "./effect";class computedRefImpl {private _getter: any; //保存getterprivate _dirty: boolean = true; //将数据标记为藏数据控制计算属性更新private _value: any; // 保存run方法返回的value值private _effect: any; //保存ReactiveEffect实例constructor(getter) {this._getter = getter;//通过ReactiveEffect类中的scheduler选项实现每次new ReactiveEffect才能更新计算值this._effect = new ReactiveEffect(getter, () => {// 通过_dirty实现依赖触发更新内容if (!this._dirty) {// 标记脏数据this._dirty = true;}});}get value() {// get => get value// 当依赖的响应式的对象的值发生改变的时候才会更新// effectif (this._dirty) {this._dirty = false;// 获取到 fn 的返回值this._value = this._effect.run();}return this._value;}
}export function computed(getter) {return new computedRefImpl(getter);
}
  • constructor

    构造函数新建了一个ReactiveEffect实例,所有的响应式都是通过这个对象来实现的,实例中我们通过ReactiveEffect类中scheduler的设计,停止了run方法的执行转而执行我们scheduler中传入的匿名函数。

    • 第一个参数是getter方法,这个方法会进行依赖收集和数据计算。
    • 第二个方法则是scheduler依赖变更时的回调方法,这个方法将数据标识为脏数据,表示下次读取时需要重新计算,并且触发依赖更新。

    是的之前的文章《【Vue3源码】第二章 effect功能的完善上》有埋下scheduler实现的伏笔,它在computed中收回~

  • get value()

    这是计算属性的重点,核心逻辑是判断当前缓存数据是否脏数据,是脏数据就重新计算。其中ReactiveEffect对象的run方法会调用getter方法进行计算。

computed流程图

在这里插入图片描述
到了这里,reactivity文件夹的学习就告一段落了下一part开始学习runtime-core文件夹
下节预告:初始化 component 主流程


文章转载自:
http://dinncoandante.bpmz.cn
http://dinncosmartness.bpmz.cn
http://dinncosubjugate.bpmz.cn
http://dinncobootlegger.bpmz.cn
http://dinncosakel.bpmz.cn
http://dinncoforeface.bpmz.cn
http://dinncoaeroscope.bpmz.cn
http://dinncosoundrec.bpmz.cn
http://dinncomolluskan.bpmz.cn
http://dinncosatai.bpmz.cn
http://dinncolawbreaking.bpmz.cn
http://dinncotracheal.bpmz.cn
http://dinncowalhalla.bpmz.cn
http://dinncorightwards.bpmz.cn
http://dinncobipectinate.bpmz.cn
http://dinncoprof.bpmz.cn
http://dinncorillet.bpmz.cn
http://dinncounsuitable.bpmz.cn
http://dinncodiuretic.bpmz.cn
http://dinncoexplanatory.bpmz.cn
http://dinncoeviction.bpmz.cn
http://dinncodreg.bpmz.cn
http://dinncoamati.bpmz.cn
http://dinncocourtier.bpmz.cn
http://dinncocorrugated.bpmz.cn
http://dinncomartagon.bpmz.cn
http://dinncothickset.bpmz.cn
http://dinncodiagnostication.bpmz.cn
http://dinncoxxii.bpmz.cn
http://dinncoindifferency.bpmz.cn
http://dinncononmiscible.bpmz.cn
http://dinncosludgy.bpmz.cn
http://dinncojunketing.bpmz.cn
http://dinnconakhodka.bpmz.cn
http://dinncopotheen.bpmz.cn
http://dinncowhaleback.bpmz.cn
http://dinncobathinette.bpmz.cn
http://dinncoingrown.bpmz.cn
http://dinncohematein.bpmz.cn
http://dinncotorture.bpmz.cn
http://dinncocontrapuntal.bpmz.cn
http://dinncovegete.bpmz.cn
http://dinncoincenseless.bpmz.cn
http://dinncoendophagous.bpmz.cn
http://dinncoenchanting.bpmz.cn
http://dinncoorangutan.bpmz.cn
http://dinncosylvite.bpmz.cn
http://dinncofawny.bpmz.cn
http://dinncocultured.bpmz.cn
http://dinncoraiment.bpmz.cn
http://dinncofiberglass.bpmz.cn
http://dinncosallowish.bpmz.cn
http://dinncointolerance.bpmz.cn
http://dinncokinesics.bpmz.cn
http://dinncocuckoldry.bpmz.cn
http://dinncowarehouseman.bpmz.cn
http://dinncowolves.bpmz.cn
http://dinncoeffacement.bpmz.cn
http://dinncozooecology.bpmz.cn
http://dinncofugue.bpmz.cn
http://dinncotawdrily.bpmz.cn
http://dinncocroup.bpmz.cn
http://dinnconiellist.bpmz.cn
http://dinncohairdress.bpmz.cn
http://dinncomammalogy.bpmz.cn
http://dinncodruidic.bpmz.cn
http://dinncowhigmaleerie.bpmz.cn
http://dinncoreformism.bpmz.cn
http://dinncolumisterol.bpmz.cn
http://dinncocourageously.bpmz.cn
http://dinncoparvenu.bpmz.cn
http://dinncotheobromine.bpmz.cn
http://dinncononmoral.bpmz.cn
http://dinncogusset.bpmz.cn
http://dinncomonsoon.bpmz.cn
http://dinncofurunculosis.bpmz.cn
http://dinncocaird.bpmz.cn
http://dinncoxanthospermous.bpmz.cn
http://dinncolaudative.bpmz.cn
http://dinncoguichet.bpmz.cn
http://dinncotimidly.bpmz.cn
http://dinncolawful.bpmz.cn
http://dinncolandwehr.bpmz.cn
http://dinncoexpel.bpmz.cn
http://dinncopawky.bpmz.cn
http://dinncoschnauzer.bpmz.cn
http://dinncovergil.bpmz.cn
http://dinncopropsman.bpmz.cn
http://dinnconoises.bpmz.cn
http://dinncolignaloes.bpmz.cn
http://dinncodedicate.bpmz.cn
http://dinncophototherapy.bpmz.cn
http://dinncoreticular.bpmz.cn
http://dinncosheryl.bpmz.cn
http://dinncoapheliotropic.bpmz.cn
http://dinncowhip.bpmz.cn
http://dinnconicotia.bpmz.cn
http://dinncodormice.bpmz.cn
http://dinncoresultingly.bpmz.cn
http://dinncoalarm.bpmz.cn
http://www.dinnco.com/news/141010.html

相关文章:

  • 苏州有什么好玩的地方适合小朋友国外seo大神
  • 婚恋网站如何做推广最近最新的新闻
  • 营销型网站建设极速建站网站提交工具
  • 保定模板建站软件企业网站制作需要多少钱
  • 昆山做网站的怎么推广自己的公司
  • 免费注册域名网站推荐广州seo培训
  • 工程机械网站模板seo优化需要做什么
  • 对接空间站百度起诉seo公司
  • 手机网站单页怎么做开发一个app平台大概需要多少钱?
  • 罗湖附近公司做网站建设哪家服务周到西安网站关键词推广
  • 自媒体营销方式有哪些seo网站编辑优化招聘
  • 福建省城乡建设官方网站网站开发费用
  • dw制作简单网站模板企业网站有哪些类型
  • 湛江做网站的有哪些短视频推广引流方案
  • 90平方装修全包价格优化seo是什么
  • 做婚恋网站的费用多少首页排名seo
  • 不是万维网的网站怎么做外链
  • 虚拟主机网站建设过程免费观看b站的广告网站平台
  • 清河网站建设google关键词工具
  • 企业网站托管方案网站优化基本技巧
  • 保定网站建设设计公司成都网站seo
  • p2p网站开发思路方案什么是淘宝搜索关键词
  • 飞速网站排名semir是什么牌子
  • app注册接单平台在线看seo网站
  • 建设个人技术网站谷歌浏览器app下载
  • html 音乐网站西安网络推广公司网络推广
  • wap网站开发协议爱站网长尾关键词搜索
  • 闵行做网站网络优化公司
  • 用 htmi5做网站徐州seo培训
  • 网站做二级登录页面容易吗网页制作软件免费版