refactor: use more efficient useComputed() implementation

This commit is contained in:
Evan You
2018-10-30 01:10:03 -04:00
parent f9e3e38fdb
commit 8602b61efb
4 changed files with 18 additions and 15 deletions

View File

@@ -1,7 +1,7 @@
import { ComponentInstance, FunctionalComponent, Component } from '../component'
import { mergeLifecycleHooks, Data, WatchOptions } from '../componentOptions'
import { VNode, Slots } from '../vdom'
import { observable, computed, stop, ComputedGetter } from '@vue/observer'
import { observable, computed } from '@vue/observer'
import { setupWatcher } from '../componentWatch'
type RawEffect = () => (() => void) | void
@@ -191,14 +191,14 @@ export function useWatch<T>(
}
export function useComputed<T>(getter: () => T): T {
const computedRef = useRef()
useUnmounted(() => {
stop((computedRef.current as ComputedGetter).runner)
})
ensureCurrentInstance()
const id = `__hooksComputed${++callIndex}`
const instance = currentInstance as ComponentInstance
const handles = instance._computedGetters || (instance._computedGetters = {})
if (isMounting) {
computedRef.current = computed(getter)
handles[id] = computed(getter)
}
return (computedRef.current as ComputedGetter)()
return handles[id]()
}
export function withHooks(render: FunctionalComponent): new () => Component {