fix(compiler-core): make v-once work with v-if/else-if/else (#2182)

Partial fix for #2035
This commit is contained in:
HcySunYang
2020-10-05 23:58:37 +08:00
committed by GitHub
parent 752ecee407
commit 9499871582
3 changed files with 35 additions and 13 deletions

View File

@@ -236,7 +236,7 @@ export interface CompoundExpressionNode extends Node {
export interface IfNode extends Node {
type: NodeTypes.IF
branches: IfBranchNode[]
codegenNode?: IfConditionalExpression
codegenNode?: IfConditionalExpression | CacheExpression // <div v-if v-once>
}
export interface IfBranchNode extends Node {

View File

@@ -20,7 +20,8 @@ import {
IfNode,
createVNodeCall,
AttributeNode,
locStub
locStub,
CacheExpression
} from '../ast'
import { createCompilerError, ErrorCodes } from '../errors'
import { processExpression } from './transformExpression'
@@ -62,13 +63,7 @@ export const transformIf = createStructuralDirectiveTransform(
) as IfConditionalExpression
} else {
// attach this branch's codegen node to the v-if root.
let parentCondition = ifNode.codegenNode!
while (
parentCondition.alternate.type ===
NodeTypes.JS_CONDITIONAL_EXPRESSION
) {
parentCondition = parentCondition.alternate
}
const parentCondition = getParentCondition(ifNode.codegenNode!)
parentCondition.alternate = createCodegenNodeForBranch(
branch,
key + ifNode.branches.length - 1,
@@ -293,3 +288,19 @@ function isSameKey(
}
return true
}
function getParentCondition(
node: IfConditionalExpression | CacheExpression
): IfConditionalExpression {
while (true) {
if (node.type === NodeTypes.JS_CONDITIONAL_EXPRESSION) {
if (node.alternate.type === NodeTypes.JS_CONDITIONAL_EXPRESSION) {
node = node.alternate
} else {
return node
}
} else if (node.type === NodeTypes.JS_CACHE_EXPRESSION) {
node = node.value as IfConditionalExpression
}
}
}