|
2 | 2 |
|
3 | 3 | import { getAndRemoveAttr } from 'compiler/helpers'
|
4 | 4 |
|
5 |
| -export function transformVIf (el: ASTElement) { |
6 |
| - const exp = getAndRemoveAttr(el, 'v-if') |
7 |
| - if (exp) { |
| 5 | +function hasConditionDirective (el: ASTElement): boolean { |
| 6 | + for (const attr in el.attrsMap) { |
| 7 | + if (/^v\-if|v\-else|v\-else\-if$/.test(attr)) { |
| 8 | + return true |
| 9 | + } |
| 10 | + } |
| 11 | + return false |
| 12 | +} |
| 13 | + |
| 14 | +function getPrevMatch (el: ASTElement): any { |
| 15 | + if (el.parent && el.parent.children) { |
| 16 | + const prev: Object = el.parent.children[el.parent.children.length - 1] |
| 17 | + return prev.attrsMap['[[match]]'] |
| 18 | + } |
| 19 | +} |
| 20 | + |
| 21 | +export function transformVIf (el: ASTElement, options: CompilerOptions) { |
| 22 | + if (hasConditionDirective(el)) { |
| 23 | + let exp |
| 24 | + const ifExp = getAndRemoveAttr(el, 'v-if') |
| 25 | + const elseifExp = getAndRemoveAttr(el, 'v-else-if') |
| 26 | + if (ifExp) { |
| 27 | + exp = ifExp |
| 28 | + } else { |
| 29 | + const prevMatch = getPrevMatch(el) |
| 30 | + if (prevMatch) { |
| 31 | + exp = elseifExp |
| 32 | + ? `!(${prevMatch}) && (${elseifExp})` // v-else-if |
| 33 | + : `!(${prevMatch})` // v-else |
| 34 | + } else if (process.env.NODE_ENV !== 'production' && options.warn) { |
| 35 | + options.warn( |
| 36 | + `v-${elseifExp ? ('else-if="' + elseifExp + '"') : 'else'} ` + |
| 37 | + `used on element <${el.tag}> without corresponding v-if.` |
| 38 | + ) |
| 39 | + return |
| 40 | + } |
| 41 | + } |
8 | 42 | el.attrsMap['[[match]]'] = exp
|
9 | 43 | el.attrsList.push({ name: '[[match]]', value: exp })
|
10 | 44 | delete el.attrsMap['v-if']
|
| 45 | + delete el.attrsMap['v-else-if'] |
| 46 | + delete el.attrsMap['v-else'] |
11 | 47 | }
|
12 |
| - // TODO: support v-else and v-else-if |
13 | 48 | }
|
0 commit comments