feat(reactivity): use Symbol for Ref._isRef (#114)

This commit is contained in:
扩散性百万甜面包 2019-10-06 03:46:36 +08:00 committed by Evan You
parent de9507b6ff
commit 0bdee72e17
2 changed files with 8 additions and 6 deletions

View File

@ -1,5 +1,5 @@
import { effect, ReactiveEffect, activeReactiveEffectStack } from './effect' import { effect, ReactiveEffect, activeReactiveEffectStack } from './effect'
import { Ref, UnwrapNestedRefs } from './ref' import { Ref, refSymbol, UnwrapNestedRefs } from './ref'
import { isFunction } from '@vue/shared' import { isFunction } from '@vue/shared'
export interface ComputedRef<T> extends Ref<T> { export interface ComputedRef<T> extends Ref<T> {
@ -43,7 +43,7 @@ export function computed<T>(
} }
}) })
return { return {
_isRef: true, _isRef: refSymbol,
// expose effect so computed can be stopped // expose effect so computed can be stopped
effect: runner, effect: runner,
get value() { get value() {

View File

@ -3,8 +3,10 @@ import { OperationTypes } from './operations'
import { isObject } from '@vue/shared' import { isObject } from '@vue/shared'
import { reactive } from './reactive' import { reactive } from './reactive'
export const refSymbol = Symbol()
export interface Ref<T> { export interface Ref<T> {
_isRef: true _isRef: symbol
value: UnwrapNestedRefs<T> value: UnwrapNestedRefs<T>
} }
@ -15,7 +17,7 @@ const convert = (val: any): any => (isObject(val) ? reactive(val) : val)
export function ref<T>(raw: T): Ref<T> { export function ref<T>(raw: T): Ref<T> {
raw = convert(raw) raw = convert(raw)
const v = { const v = {
_isRef: true, _isRef: refSymbol,
get value() { get value() {
track(v, OperationTypes.GET, '') track(v, OperationTypes.GET, '')
return raw return raw
@ -29,7 +31,7 @@ export function ref<T>(raw: T): Ref<T> {
} }
export function isRef(v: any): v is Ref<any> { export function isRef(v: any): v is Ref<any> {
return v ? v._isRef === true : false return v ? v._isRef === refSymbol : false
} }
export function toRefs<T extends object>( export function toRefs<T extends object>(
@ -47,7 +49,7 @@ function toProxyRef<T extends object, K extends keyof T>(
key: K key: K
): Ref<T[K]> { ): Ref<T[K]> {
const v = { const v = {
_isRef: true, _isRef: refSymbol,
get value() { get value() {
return object[key] return object[key]
}, },