当前位置: 首页 > 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/234284.html

相关文章:

  • 盘古建站模板外贸订单一般在哪个平台接?
  • 网络平台管理制度百度推广seo效果怎么样
  • 网络游戏的特点seo外链平台热狗
  • 怎么做淘宝链接网站google推广教程
  • 无锡网站建设团队微信附近人推广引流
  • 屯留做网站哪里好西安seo顾问培训
  • 泰安建材网站建设电话站内推广
  • 做版权素材网站门槛搜收录网
  • 做网站店铺图片用什么软件企业网络的组网方案
  • 网站开发数据库设计百度seo视频教程
  • 网站建设优点搜索推广开户
  • 建个微网站多少钱seo综合查询
  • 企业网页设计网站案例网站关键词怎么快速上排名
  • 容城县建设银行网站湛江今日头条新闻
  • 网站制作例子百度指数电脑端查询
  • Html5移动网站营销推广策略
  • 投资网站维护移动广告联盟
  • 济南槐荫网站开发公司百度代发收录
  • 企业商务网站建设论文百度公司好进吗
  • 九江做网站哪家便宜线上广告
  • 百斯特网站建设凡科建站app
  • 龙游做网站建站平台哪个比较权威
  • 网站建设制作设计营销 上海下载浏览器
  • 网站规划的缩略图电商代运营收费标准
  • 做网站和seo哪个好希爱力的作用与功效
  • 响应式网站框架整合营销传播案例
  • 福州建设工程招投标信息网seo网站营销推广
  • 一级a做爰片免费网站无毒站内优化
  • 英文专业的网站设计ai智能营销系统
  • 济南网站优化百度站长平台网址