fix(v-once): fix v-once usage with v-if and v-for

fix #2035
This commit is contained in:
Evan You
2020-09-02 12:29:07 -04:00
parent ad93fa42fc
commit 52e45a9850
4 changed files with 77 additions and 13 deletions

View File

@@ -399,6 +399,7 @@ export function traverseNode(
}
// exit transforms
context.currentNode = node
let i = exitFns.length
while (i--) {
exitFns[i]()

View File

@@ -1,14 +1,21 @@
import { NodeTransform } from '../transform'
import { findDir } from '../utils'
import { NodeTypes } from '../ast'
import { ElementNode, ForNode, IfNode, NodeTypes } from '../ast'
import { SET_BLOCK_TRACKING } from '../runtimeHelpers'
const seen = new WeakSet()
export const transformOnce: NodeTransform = (node, context) => {
if (node.type === NodeTypes.ELEMENT && findDir(node, 'once', true)) {
if (seen.has(node)) {
return
}
seen.add(node)
context.helper(SET_BLOCK_TRACKING)
return () => {
if (node.codegenNode) {
node.codegenNode = context.cache(node.codegenNode, true /* isVNode */)
const cur = context.currentNode as ElementNode | IfNode | ForNode
if (cur.codegenNode) {
cur.codegenNode = context.cache(cur.codegenNode, true /* isVNode */)
}
}
}