大厂新题: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搜索枇杷面试获取更多题目