import VNode from 'core/vdom/vnode' import { isArray } from 'core/util' /** * 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, this._c, 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 (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 }