feat: skip constant trees and memoize fn

This commit is contained in:
Evan You
2018-10-28 16:41:29 -04:00
parent d8cda2387f
commit 131936f144
2 changed files with 61 additions and 40 deletions

View File

@@ -0,0 +1,53 @@
// Used for memoizing trees inside render functions.
//
// Example (equivalent of v-once):
//
// render() {
// return memoize(h('div', this.msg), this, 0)
// }
//
// Memoize baesd on keys:
//
// render() {
// return memoize(h('div', this.msg + this.count), this, 0, [this.msg])
// }
import { Component } from '../component'
import { warn } from '../warning'
const memoizeMap = new WeakMap()
export function memoize(
getter: () => any,
instance: Component,
id: number,
keys?: any[]
): any {
if (__DEV__ && !Array.isArray(keys)) {
warn(
`keys passed to v-memo or memoize must be an array. Got ${String(keys)}`
)
}
let storage = memoizeMap.get(instance)
if (!storage) {
storage = []
memoizeMap.set(instance, storage)
}
const record = storage[id]
if (!record) {
const value = getter()
storage[id] = [value, keys]
return value
} else {
const [prevValue, prevKeys] = record
record[1] = keys
if (keys) {
for (let i = 0; i < keys.length; i++) {
if (keys[i] !== prevKeys[i]) {
return (record[0] = getter())
}
}
}
return prevValue
}
}