/* @flow */ /** * Runtime helper for rendering static trees. */ export function renderStatic ( index: number, isInFor: boolean ): VNode | Array { const cached = this._staticTrees || (this._staticTrees = []) let tree = cached[index] // if has already-rendered static tree and not inside v-for, // we can reuse the same tree. if (tree && !isInFor) { return tree } // otherwise, render a fresh tree. tree = cached[index] = this.$options.staticRenderFns[index].call( this._renderProxy, null, this // for render fns generated for functional component templates ) markStatic(tree, `__static__${index}`, false) return tree } /** * Runtime helper for v-once. * Effectively it means marking the node as static with a unique key. */ export function markOnce ( tree: VNode | Array, index: number, key: string ) { markStatic(tree, `__once__${index}${key ? `_${key}` : ``}`, true) return tree } function markStatic ( tree: VNode | Array, key: string, isOnce: boolean ) { if (Array.isArray(tree)) { for (let i = 0; i < tree.length; i++) { if (tree[i] && typeof tree[i] !== 'string') { markStaticNode(tree[i], `${key}_${i}`, isOnce) } } } else { markStaticNode(tree, key, isOnce) } } function markStaticNode (node, key, isOnce) { node.isStatic = true node.key = key node.isOnce = isOnce }