大厂新题:Vue3中ref的执行逻辑是什么?

下面是ref的整个源码流程。

ref的定义

源码路径:packages/reactivity/src/ref.ts

function ref(value?: unknown) {
  return createRef(value, false)
}

createRef的定义

源码路径:packages/reactivity/src/ref.ts

function createRef(rawValue: unknown, shallow: boolean) {
  // 如果本身是一个ref对象,则直接返回
  if (isRef(rawValue)) {
   return rawValue
  }
  // 构建ref对象
  return new RefImpl(rawValue, shallow)
}

RefImpl的定义

源码路径:packages/reactivity/src/ref.ts

class RefImpl<T> {
  private _value: T
  ...

  constructor(value: T, public readonly __v_isShallow: boolean) {
   ...
   // __v_isShallow(调用shallowRef时为true)为true时就是原有值
   // 否则调用toReactive(该方法参数为对象时调用reactive返回Proxy对象,否则直接返回value)
   // e.g: ref(1),则_value为1
   // e.g: ref({num: 1}),则_value = reactive({num: 1}),即Proxy对象
   this._value = __v_isShallow ? value : toReactive(value)
  }

  get value() {
   ...
  }

  set value(newVal) {
   ...
  }
}

toReactive的定义

源码路径:packages/reactivity/src/reactive.ts

export const toReactive = <T extends unknown>(value: T): T =>
  isObject(value) ? reactive(value) : value

总结

1. ref调用
2. 判断ref参数(下面ref参数统一称为value)是否本身为RefImpl对象,如果是,直接返回,如果不是,构造RefImpl对象
3. 在RefImpl构造函数中,如果为shallowRef(浅引用),则私有属性_value为value,否则判断是否为对象,如果是对象则使用reactive方法返回一个Proxy对象(深度代理),否则为value。
本题目来自枇杷村IT面试宝典小程序,可千万vx搜索枇杷面试获取更多题目
#面试#
全部评论

相关推荐

02-08 20:56
已编辑
南京工业大学 Java
在等offer的比尔很洒脱:我也是在实习,项目先不说,感觉有点点小熟悉,但是我有点疑问,这第一个实习,公司真的让实习生去部署搭建和引入mq之类的吗,是不是有点过于信任了,我实习过的两个公司都是人家正式早搭好了,根本摸不到部署搭建的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务