You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.4 KiB
61 lines
1.4 KiB
|
3 years ago
|
/* @flow */
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Runtime helper for rendering static trees.
|
||
|
|
*/
|
||
|
|
export function renderStatic (
|
||
|
|
index: number,
|
||
|
|
isInFor: boolean
|
||
|
|
): VNode | Array<VNode> {
|
||
|
|
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<VNode>,
|
||
|
|
index: number,
|
||
|
|
key: string
|
||
|
|
) {
|
||
|
|
markStatic(tree, `__once__${index}${key ? `_${key}` : ``}`, true)
|
||
|
|
return tree
|
||
|
|
}
|
||
|
|
|
||
|
|
function markStatic (
|
||
|
|
tree: VNode | Array<VNode>,
|
||
|
|
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
|
||
|
|
}
|