小彭看vue源码-第一天

236 阅读2分钟

reactive

export const enum ReactiveFlags {
  SKIP = '__v_skip',
  IS_REACTIVE = '__v_isReactive',
  IS_READONLY = '__v_isReadonly',
  IS_SHALLOW = '__v_isShallow',
  RAW = '__v_raw'
}

reactive

先是判断了isReadonly(target)这个属性 然后就是

return createReactObject(target,false,    mutableHandlers,
    mutableCollectionHandlers,
    reactiveMap);

reactiveonly

return createReactObject(target,true,        readonlyHandlers,
    readonlyCollectionHandlers,
    readonlyMap
  )

readonly

return createReactObject(target,false,        shallowReadonlyHandlers,
    shallowReadonlyCollectionHandlers,
    shallowReadonlyMap
  )

createReactIveObject()

五个参数 第一个value 第二个Boolean是不是isReadonly 第三个代理处理函数 第四个收集函数 第五个weakMap处理函数

  • 首先会判断是不是对象,还是看是不是开发环境,不是的还是会直接返回的
  • 然后还是会判断这个target是不是已经是了Reactive了,是的话就直接返回了,除开isReadonly(这种情况)
  • 还要判断这个target是不是以及被记录了,是的话直接返回这个代理对象了
  • 然后会经过一个函数getTargetType得到targetType用来判断
  • 然后就是代理对象,但是这里会判断一下这个TargetType.COLLECTION,根据这个来判断是收集依赖,还是基本处理函数
export const mutableHandlers: ProxyHandler<object> =
  /*#__PURE__*/ new MutableReactiveHandler()

export const readonlyHandlers: ProxyHandler<object> =
  /*#__PURE__*/ new ReadonlyReactiveHandler()

export const shallowReactiveHandlers = /*#__PURE__*/ new MutableReactiveHandler(
  true
)

// Props handlers are special in the sense that it should not unwrap top-level
// refs (in order to allow refs to be explicitly passed down), but should
// retain the reactivity of the normal readonly object.
export const shallowReadonlyHandlers =
  /*#__PURE__*/ new ReadonlyReactiveHandler(true)

其他函数

toReactive和toReadOnly都会判断是不是对象的

/**
 * Returns a reactive proxy of the given value (if possible).
 *
 * If the given value is not an object, the original value itself is returned.
 *
 * @param value - The value for which a reactive proxy shall be created.
 */
export const toReactive = <T extends unknown>(value: T): T =>
  isObject(value) ? reactive(value) : value

/**
 * Returns a readonly proxy of the given value (if possible).
 *
 * If the given value is not an object, the original value itself is returned.
 *
 * @param value - The value for which a readonly proxy shall be created.
 */
export const toReadonly = <T extends unknown>(value: T): T =>
  isObject(value) ? readonly(value) : value

isReactive 如果这个属性本来就是reactive,那么就会返回给你 __v_reactive isReadonly 就是判断 __v_reactive isShallow 就是判断 __v_readonly

export function isReactive(value: unknown): boolean {
 if (isReadonly(value)) {
   return isReactive((value as Target)[ReactiveFlags.RAW])
 }
 return !!(value && (value as Target)[ReactiveFlags.IS_REACTIVE])
}

export function isReadonly(value: unknown): boolean {
 return !!(value && (value as Target)[ReactiveFlags.IS_READONLY])
}

export function isShallow(value: unknown): boolean {
 return !!(value && (value as Target)[ReactiveFlags.IS_SHALLOW])
}