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

生态建设研究所网站正规拉新推广平台有哪些

生态建设研究所网站,正规拉新推广平台有哪些,京东网站开发多少钱,常德网站建设培训机构简介 今天来实现一下 shallowReactive 这个 API。 reactive函数是一个深响应,当你取出的值为对象类型,需要再次调用 reactive进行响应式处理。很明显我们目前的代码是一个浅响应,即 只代理了对象的第一层,也就是 shallowReactiv…

shallowReactive

简介

今天来实现一下 shallowReactive 这个 API。

reactive函数是一个深响应,当你取出的值为对象类型,需要再次调用 reactive进行响应式处理。很明显我们目前的代码是一个浅响应,即 只代理了对象的第一层,也就是 shallowReactive

代码地址: https://github.com/SuYxh/share-vue3

代码并没有按照源码的方式去进行组织,目的是学习、实现 vue3 响应式系统的核心,用最少的代码去实现最核心的能力,减少我们的学习负担,并且所有的流程都会有配套的图片,图文 + 代码,让我们学习更加轻松、快乐。

每一个功能都会提交一个 commit ,大家可以切换查看,也顺变练习练习 git 的使用。

单元测试

it('深响应 reactive', () => {const mockFn = vi.fn();const obj = reactive({ foo: { bar: 1 } })effect(function effectFn() {console.log(obj.foo.bar);})expect(mockFn).toHaveBeenCalledTimes(1);obj.foo.bar = 2expect(mockFn).toHaveBeenCalledTimes(2);
})it('浅响应 shallowReactive', () => {const mockFn = vi.fn();const obj = shallowReactive({ foo: { bar: 1 } })effect(function effectFn() {console.log(obj.foo.bar);})expect(mockFn).toHaveBeenCalledTimes(1);obj.foo.bar = 2expect(mockFn).toHaveBeenCalledTimes(1);
})

代码实现

reactive函数的get中,增加如下判断:

if (typeof res === 'object' && res !== null) {return reactive(res)
}

新增一个shallowReactive 函数并导出, 和之前的 reactive函数一样。

运行单测

深响应 reactive:

image-20240122004441759

浅响应 shallowReactive:

image-20240122004510851

都没有问题!

重构

我们看到 shallowReactivereactive有极大的相似,需进行代码抽离:

export function createReactive(target, isShallow = false) {return new Proxy(target, {// 拦截读取操作get(target, key, receiver) {// 代理对象可以通过 raw 属性访问原始数据if (key === symbolRaw) {return target;}const res = Reflect.get(target, key, receiver);//  如果是浅响应,则直接返回原始值if (isShallow) {return res;}if (typeof res === "object" && res !== null) {return reactive(res);}// 依赖收集track(target, key);return res;},// 拦截设置操作set(target, key, newVal, receiver) {// 先获取旧值const oldVal = target[key];// 如果属性不存在,则说明是在添加新属性,否则是设置已有属性const type = Object.prototype.hasOwnProperty.call(target, key)? TriggerType.SET: TriggerType.ADD;// 设置属性值const res = Reflect.set(target, key, newVal, receiver);// target === receiver.raw 说明 receiver 就是 target 的代理对象if (target === receiver[symbolRaw]) {// 较新值与旧值,只有当它们不全等,并且不都是 NaN 的时候才触发响应if (oldVal !== newVal && (oldVal === oldVal || newVal === newVal)) {trigger(target, key, type);}}return res;},// 拦截 in 操作符has(target, key) {track(target, key);return Reflect.has(target, key);},// 拦截 for in 循环ownKeys(target) {track(target, ITERATE_KEY);return Reflect.ownKeys(target);},// 拦截删除deleteProperty(target, key) {// 检查被操作的属性是否是对象自己的属性const hadKey = Object.prototype.hasOwnProperty.call(target, key);// 使用 Reflect.deleteProperty 完成属性的删除const res = Reflect.deleteProperty(target, key);if (res && hadKey) {// 只有当被删除的属性是对象自己的属性并且成功删除时,才触发更新trigger(target, key, TriggerType.DEL);}return res;},});
}// 对原始数据的代理
export function reactive(target) {return createReactive(target);
}export function shallowReactive(target) {return createReactive(target, true);
}

运行测试

pnpm test

image-20240122004859928

重构后的代码也没有问题!

引导扫码关注

一个前端小学生的学习之路,如果你喜欢前端,我们可以一起进行学习、交流、共建。可以添加好友,结伴学习,成长的路上不孤单!

http://www.dtcms.com/wzjs/224337.html

相关文章:

  • 邢台专业做网站价格软文推广营销
  • 政府网站建设运营合同百度号码
  • 国内工程机械行业网站建设现状南京seo推广
  • 上海广告公司招聘信息沈阳seo优化排名公司
  • 会外语和做网站广东seo推广哪里好
  • mac做网站改html文件seo关键字优化教程
  • 微信公众号链接的网站怎么做的短信广告投放软件
  • WordPress 微信采集助手科学新概念seo外链
  • 温州做外贸网站关键词seo公司真实推荐
  • 做美甲的网站网络推广渠道和方式
  • 重庆网站推广外包企业洛阳seo网络推广
  • 酷炫网站设计风格微信小程序官网
  • 深圳网站建设i9988深圳网络推广公司有哪些
  • 自助建站软件杭州seo代理公司
  • 建设银行住房公积金卡网站网站seo入门基础教程书籍
  • 现在给别人做网站还赚钱吗什么企业需要网络营销和网络推广
  • 静态网站托管网站排名查询站长之家
  • 自己做的网站能放到网上么环球网广东疫情最新消息
  • 电子商务网站平台建设前景展望免费网站软件推荐
  • 机械行业网站 方案竞价推广账户竞价托管费用
  • 南京江宁网站制作google chrome浏览器
  • 用dw做的网站容易变形贵阳网站建设公司
  • 福州做网站价格网站关键词排名
  • 石家庄展为网络公司关键词首页排名优化
  • 网站制作xiu021今日西安头条最新消息
  • 最近高清免费资源seo公司品牌哪家好
  • 今日国内新闻热点seo优化外包公司
  • 济南网站建设第六网建南宁seo手段
  • 建立网站的方法网络广告的概念
  • 网站做转链接违反版权吗肇庆seo按天计费