]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
perf: avoid using WeakSet for isRef check
authorEvan You <yyx990803@gmail.com>
Mon, 30 Sep 2019 14:52:50 +0000 (10:52 -0400)
committerEvan You <yyx990803@gmail.com>
Mon, 30 Sep 2019 18:52:10 +0000 (14:52 -0400)
packages/reactivity/__tests__/ref.spec.ts
packages/reactivity/src/computed.ts
packages/reactivity/src/ref.ts
packages/runtime-core/src/vnode.ts

index 32cb6bccea7309dec8dcf76afb0eae3e51dc8418..899cf103e9a5081be215e02b4cd93cad377e510d 100644 (file)
@@ -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)
index 15c47a43f943b749bed70f2e675a8785ab7a29e0..42e1c67b86d5c10bf6b4a3cc3ac396343a64bd13 100644 (file)
@@ -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<T> {
-  [isRefSymbol]: true
+  _isRef: true
   readonly value: UnwrapNestedRefs<T>
   readonly effect: ReactiveEffect
 }
 
 export interface WritableComputedRef<T> {
-  [isRefSymbol]: true
+  _isRef: true
   value: UnwrapNestedRefs<T>
   readonly effect: ReactiveEffect
 }
@@ -45,7 +45,8 @@ export function computed<T>(
       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<T>(
       }
     }
   }
-  knownRefs.add(computedRef)
-  return computedRef
 }
 
 function trackChildRun(childRunner: ReactiveEffect) {
index ed4ed386093aeabf601efea4855a086219cafbec..c3fc1c02fd168014a45e7abab8dc11937bc62971 100644 (file)
@@ -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<T> {
-  // 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<T>
 }
 
@@ -21,6 +15,7 @@ const convert = (val: any): any => (isObject(val) ? reactive(val) : val)
 export function ref<T>(raw: T): Ref<T> {
   raw = convert(raw)
   const v = {
+    _isRef: true,
     get value() {
       track(v, OperationTypes.GET, '')
       return raw
@@ -30,12 +25,11 @@ export function ref<T>(raw: T): Ref<T> {
       trigger(v, OperationTypes.SET, '')
     }
   }
-  knownRefs.add(v)
   return v as Ref<T>
 }
 
 export function isRef(v: any): v is Ref<any> {
-  return knownRefs.has(v)
+  return v ? v._isRef === true : false
 }
 
 export function toRefs<T extends object>(
@@ -53,6 +47,7 @@ function toProxyRef<T extends object, K extends keyof T>(
   key: K
 ): Ref<T[K]> {
   const v = {
+    _isRef: true,
     get value() {
       return object[key]
     },
@@ -60,7 +55,6 @@ function toProxyRef<T extends object, K extends keyof T>(
       object[key] = newVal
     }
   }
-  knownRefs.add(v)
   return v as Ref<T[K]>
 }
 
index 9b4d74cba7f0a98c8613b8ebd649c7fbbacc8de3..b5b686d81a57a2e476aacb1407d09fc544304c7d 100644 (file)
@@ -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(