实现shallowReadonly和isProxy功能示例详解

 更新时间:2022年12月25日 17:20:04   作者:IamZJT_  
这篇文章主要为大家介绍了实现shallowReadonly和isProxy功能示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一、实现shallowReadonly

(一)单元测试

// src/reactivity/tests/shallowReadonly.spec.ts
import { isReadonly, shallowReadonly } from '../reactive';
describe('shallowReadonly', () => {
  it('should not make non-reactive properties reactive', () => {
    const props = shallowReadonly({ n: { foo: 1 } });
    expect(isReadonly(props)).toBe(true);
    expect(isReadonly(props.n)).toBe(false);
  });
});

shallowReadonly,浅层只读,从单测也很容易看出来。一般的应用场景,可能就是用于项目的优化,避免将深层全部转为readonly。

(二)代码实现

// src/reactivity/reactive.ts
import { mutableHandlers, readonlyHandlers, shallowReadonlyHandlers } from './baseHandlers';
export function shallowReadonly(target) {
  return createReactiveObject(target, shallowReadonlyHandlers);
}
// src/reactivity/baseHandlers.ts
import { isObject, extend } from '../shared';
function createGetter(isReadonly = false, shallow = false) {
  return function get(target, key) {
    if (key === ReactiveFlags.IS_REACTIVE) {
      return !isReadonly;
    } else if (key === ReactiveFlags.IS_READONLY) {
      return isReadonly;
    }
    const res = Reflect.get(target, key);
    // + shallow,直接返回,深层不转响应式
    if (shallow) {
      return res;
    }
    if (isObject(res)) {
      return isReadonly ? readonly(res) : reactive(res);
    }
    if (!isReadonly) {
      track(target, key);
    }
    return res;
  };
}
const shallowReadonlyGet = createGetter(true, true);
// + 其实可见shallowReadonly的set逻辑同readonly,所以从readonly那继承过来,然后改写get逻辑即可
export const shallowReadonlyHandlers = extend({}, readonlyHandlers, {
  get: shallowReadonlyGet
});

最基本的逻辑,这就完成了,单测一下。

(三)额外的单测

当然为了严谨一些,我们还是测试一下,浅层和深层的set操作的结果,是否是我们期望的。

it('should make root level properties readonly', () => {
  console.warn = jest.fn();
  const user = shallowReadonly({ age: 10 });
  user.age = 11;
  expect(console.warn).toBeCalled();
});
it('should NOT make nested properties readonly', () => {
  console.warn = jest.fn();
  const props = shallowReadonly({ n: { foo: 1 } });
  props.n.foo = 2;
  expect(props.n.foo).toBe(2);
  expect(console.warn).not.toBeCalled();
});

二、实现isProxy

这里贴上官网对isProxy的描述。

Checks if an object is a proxy created by reactive or readonly

(一)单元测试

我们只需要在之前的用例中补充断言即可。

// src/reactivity/tests/reactive.spec.ts
import { reactive, isReactive, isProxy } from '../reactive';
// reactive -> happy path
expect(isProxy(observed)).toBe(true);
// src/reactivity/tests/readonly.spec.ts
import { readonly, isReadonly, isProxy } from '../reactive';
// readonly -> happy path
expect(isProxy(wrapped)).toBe(true);

(二)代码实现

其实实现起来,我们只要复用之前的isReactiveisProxy即可。

// src/reactivity/reactive.ts
export function isProxy(value) {
  return isReactive(value) || isReadonly(value);
}

以上就是实现shallowReadonly和isProxy功能示例详解的详细内容,更多关于shallowReadonly isProxy功能的资料请关注脚本之家其它相关文章!

相关文章

  • 如何在vue3中使用jsx语法

    如何在vue3中使用jsx语法

    这篇文章主要介绍了在vue3中使用jsx语法,下面主要通过对比jsx和template不同语法,来实现同样的功能,需要的朋友可以参考下
    2023-03-03
  • vue项目部署到Apache服务器中遇到的问题解决

    vue项目部署到Apache服务器中遇到的问题解决

    这篇文章主要介绍了vue项目部署到Apache中遇到的问题解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 详解vue中多个有顺序要求的异步操作处理

    详解vue中多个有顺序要求的异步操作处理

    这篇文章主要介绍了vue中多个有顺序要求的异步操作处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • vue-cli3 karma单元测试的实现

    vue-cli3 karma单元测试的实现

    这篇文章主要介绍了vue-cli3 karma单元测试的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • 教你用Cordova打包Vue项目的方法

    教你用Cordova打包Vue项目的方法

    这篇文章主要介绍了教你用Cordova打包Vue项目的方法,详细的介绍了如何Vue项目打包成app,具有一定的参考价值,有兴趣的可以了解一下
    2017-10-10
  • Vue图片裁剪组件实例代码

    Vue图片裁剪组件实例代码

    这篇文章主要给大家介绍了关于Vue图片裁剪组件的相关资料,本文介绍的组件是基于vue-cropper二次封装,vue-cropper大家应该都很熟悉了吧,需要的朋友可以参考下
    2021-07-07
  • 使用electron-builder将项目打包成桌面程序的详细教程

    使用electron-builder将项目打包成桌面程序的详细教程

    这篇文章主要介绍了使用electron-builder把web端的项目打包生成桌面程序,并可安装程序,文中通过代码示例和图文结合的方式给大家介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-08-08
  • 记录vue做微信自定义分享的一些问题

    记录vue做微信自定义分享的一些问题

    这篇文章主要介绍了记录vue做微信自定义分享的一些问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • vue路由嵌套的SPA实现步骤

    vue路由嵌套的SPA实现步骤

    这篇文章主要为大家详细介绍了vue路由嵌套的SPA实现步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • vue如何定义全局变量和全局方法实例代码

    vue如何定义全局变量和全局方法实例代码

    在项目中经常会复用一些变量和函数,比如用户的登录token,用户信息等,这时将它们设为全局的就显得很重要了,下面这篇文章主要给大家介绍了关于vue如何定义全局变量和全局方法的相关资料,需要的朋友可以参考下
    2023-04-04

最新评论