Browse Source

fix v-for on v-else branch regression (fix #4464)

dev
Evan You 8 years ago
parent
commit
4cca50725a
  1. 8
      src/compiler/codegen/index.js
  2. 23
      test/unit/features/directives/if.spec.js

8
src/compiler/codegen/index.js

@ -298,14 +298,18 @@ function genChildren (el: ASTElement, checkSkip?: boolean): string | void {
function canSkipNormalization (children): boolean {
for (let i = 0; i < children.length; i++) {
const el: any = children[i]
if (el.for || el.tag === 'template' || el.tag === 'slot' ||
(el.if && el.ifConditions.some(c => c.tag === 'template'))) {
if (needsNormalization(el) ||
(el.if && el.ifConditions.some(c => needsNormalization(c.block)))) {
return false
}
}
return true
}
function needsNormalization (el) {
return el.for || el.tag === 'template' || el.tag === 'slot'
}
function genNode (node: ASTNode) {
if (node.type === 1) {
return genElement(node)

23
test/unit/features/directives/if.spec.js

@ -141,7 +141,7 @@ describe('Directive v-if', () => {
const vm = new Vue({
template: `
<div>
<span v-for="item,i in list" v-if="item.value">{{i}}</span>
<span v-for="(item, i) in list" v-if="item.value">{{i}}</span>
</div>
`,
data: {
@ -169,7 +169,7 @@ describe('Directive v-if', () => {
const vm = new Vue({
template: `
<div>
<span v-for="item,i in list" v-if="item.value">hello</span>
<span v-for="(item, i) in list" v-if="item.value">hello</span>
<span v-else>bye</span>
</div>
`,
@ -194,6 +194,25 @@ describe('Directive v-if', () => {
}).then(done)
})
it('should work with v-for on v-else branch', done => {
const vm = new Vue({
template: `
<div>
<span v-if="false">hello</span>
<span v-else v-for="item in list">{{ item }}</span>
</div>
`,
data: {
list: [1, 2, 3]
}
}).$mount()
expect(vm.$el.textContent.trim()).toBe('123')
vm.list.reverse()
waitForUpdate(() => {
expect(vm.$el.textContent.trim()).toBe('321')
}).then(done)
})
it('should work properly on component root', done => {
const vm = new Vue({
template: `

Loading…
Cancel
Save