From 46bd9dbab06feeeadb7ae32a080b4fc32fc4511f Mon Sep 17 00:00:00 2001 From: Evan You Date: Mon, 30 Sep 2019 10:52:50 -0400 Subject: [PATCH] perf: avoid using WeakSet for isRef check --- packages/reactivity/__tests__/ref.spec.ts | 2 +- packages/reactivity/src/computed.ts | 11 +++++------ packages/reactivity/src/ref.ts | 14 ++++---------- packages/runtime-core/src/vnode.ts | 2 +- 4 files changed, 11 insertions(+), 18 deletions(-) diff --git a/packages/reactivity/__tests__/ref.spec.ts b/packages/reactivity/__tests__/ref.spec.ts index 32cb6bcce..899cf103e 100644 --- a/packages/reactivity/__tests__/ref.spec.ts +++ b/packages/reactivity/__tests__/ref.spec.ts @@ -1,7 +1,7 @@ import { ref, effect, reactive, isRef, toRefs } from '../src/index' import { computed } from '@vue/runtime-dom' -describe('reactivity/value', () => { +describe('reactivity/ref', () => { it('should hold a value', () => { const a = ref(1) expect(a.value).toBe(1) diff --git a/packages/reactivity/src/computed.ts b/packages/reactivity/src/computed.ts index 15c47a43f..42e1c67b8 100644 --- a/packages/reactivity/src/computed.ts +++ b/packages/reactivity/src/computed.ts @@ -1,15 +1,15 @@ import { effect, ReactiveEffect, activeReactiveEffectStack } from './effect' -import { UnwrapNestedRefs, isRefSymbol, knownRefs } from './ref' +import { UnwrapNestedRefs } from './ref' import { isFunction } from '@vue/shared' export interface ComputedRef { - [isRefSymbol]: true + _isRef: true readonly value: UnwrapNestedRefs readonly effect: ReactiveEffect } export interface WritableComputedRef { - [isRefSymbol]: true + _isRef: true value: UnwrapNestedRefs readonly effect: ReactiveEffect } @@ -45,7 +45,8 @@ export function computed( dirty = true } }) - const computedRef = { + return { + _isRef: true, // expose effect so computed can be stopped effect: runner, get value() { @@ -67,8 +68,6 @@ export function computed( } } } - knownRefs.add(computedRef) - return computedRef } function trackChildRun(childRunner: ReactiveEffect) { diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index ed4ed3860..c3fc1c02f 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -3,14 +3,8 @@ import { OperationTypes } from './operations' import { isObject } from '@vue/shared' import { reactive } from './reactive' -export const knownRefs = new WeakSet() - -export const isRefSymbol = Symbol() - export interface Ref { - // this is a type-only field to avoid objects with 'value' property being - // treated as a ref by TypeScript - [isRefSymbol]: true + _isRef: true value: UnwrapNestedRefs } @@ -21,6 +15,7 @@ const convert = (val: any): any => (isObject(val) ? reactive(val) : val) export function ref(raw: T): Ref { raw = convert(raw) const v = { + _isRef: true, get value() { track(v, OperationTypes.GET, '') return raw @@ -30,12 +25,11 @@ export function ref(raw: T): Ref { trigger(v, OperationTypes.SET, '') } } - knownRefs.add(v) return v as Ref } export function isRef(v: any): v is Ref { - return knownRefs.has(v) + return v ? v._isRef === true : false } export function toRefs( @@ -53,6 +47,7 @@ function toProxyRef( key: K ): Ref { const v = { + _isRef: true, get value() { return object[key] }, @@ -60,7 +55,6 @@ function toProxyRef( object[key] = newVal } } - knownRefs.add(v) return v as Ref } diff --git a/packages/runtime-core/src/vnode.ts b/packages/runtime-core/src/vnode.ts index 9b4d74cba..b5b686d81 100644 --- a/packages/runtime-core/src/vnode.ts +++ b/packages/runtime-core/src/vnode.ts @@ -126,7 +126,7 @@ export function createBlock( } export function isVNode(value: any): boolean { - return value && value._isVNode + return value ? value._isVNode === true : false } export function createVNode(