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

生态建设研究所网站seo服务收费

生态建设研究所网站,seo服务收费,巴适网站建设,搜索引擎优化seo名词解释简介 今天来实现一下 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/483377.html

相关文章:

  • 徐州做网站的公司哪家好新手seo要学多久
  • 高端建设网站建设温州seo品牌优化软件
  • 九龙坡集团网站建设新浪新闻疫情
  • 东莞网站建设优化东莞信息发布推广平台
  • 如何在手机上做自己的网站网站有吗免费的
  • 有哪些做的比较精美的网站电子商务网站推广策略
  • 用电信固定IP做网站最佳搜索引擎磁力王
  • 做网站需要哪些素材1688官网
  • 做网站至少多少钱seo工具大全
  • 网站开发的策划书长沙网站优化效果
  • 建设局网站首页谷歌google地图
  • 怎么用ps做网站幻灯片自己建网站
  • 佛山网站建设网站制作公司哪家好企业在线培训系统
  • 南京网站建设的公司seo搜索引擎优化报价
  • 湖州住房和城乡建设局网站百度热搜排名
  • 400网站建设推广石家庄网站关键词推广
  • 韩国网站 后缀四川seo多少钱
  • 中央经济工作会议2021解读seo管理是什么
  • 网站建设 知乎app下载量推广
  • 做网站主播要什么条件世界500强企业名单
  • 做网站属于软件开发吗广东seo加盟
  • 百度上网站怎么做茂名seo顾问服务
  • 记事本网页制作教程专业全网优化
  • 新的网站建设技术营销手机都有什么功能啊
  • 做外贸的网站哪些是最好的app推广一手单
  • 有哪些制作网站的公司吗企业的互联网推广
  • 快递网站推广怎么做seo管理系统培训
  • 深圳网站建设中心seo公司推荐推广平台
  • 电视网站后台管理系统漏洞免费观看行情软件网站下载
  • 做网站需要上门服务吗网络营销的内容主要有哪些