Skip to content

Commit a575cbb

Browse files
author
Evan You
committed
fix v-repeat diff algorithm for v-transition
1 parent e498191 commit a575cbb

File tree

3 files changed

+29
-18
lines changed

3 files changed

+29
-18
lines changed

src/compiler.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -863,7 +863,7 @@ CompilerProto.destroy = function () {
863863
}
864864
el.vue_vm = null
865865

866-
this.destroyed = true
866+
compiler.destroyed = true
867867
// emit destroy hook
868868
compiler.execHook('afterDestroy')
869869

src/directives/repeat.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ module.exports = {
9494
oldIndex,
9595
targetNext,
9696
currentNext,
97+
nextEl,
9798
ctn = this.container,
9899
oldVMs = this.oldVMs,
99100
vms = []
@@ -156,12 +157,27 @@ module.exports = {
156157
item = vm.$data
157158
targetNext = vms[i + 1]
158159
if (vm.$reused) {
159-
currentNext = vm.$el.nextSibling.vue_vm
160+
nextEl = vm.$el.nextSibling
161+
// destroyed VMs' element might still be in the DOM
162+
// due to transitions
163+
while (!nextEl.vue_vm && nextEl !== this.ref) {
164+
nextEl = nextEl.nextSibling
165+
}
166+
currentNext = nextEl.vue_vm
160167
if (currentNext !== targetNext) {
161168
if (!targetNext) {
162169
ctn.insertBefore(vm.$el, this.ref)
163170
} else {
164-
ctn.insertBefore(vm.$el, targetNext.$el)
171+
nextEl = targetNext.$el
172+
// new VMs' element might not be in the DOM yet
173+
// due to transitions
174+
while (!nextEl.parentNode) {
175+
targetNext = vms[nextEl.vue_vm.$index + 1]
176+
nextEl = targetNext
177+
? targetNext.$el
178+
: this.ref
179+
}
180+
ctn.insertBefore(vm.$el, nextEl)
165181
}
166182
}
167183
delete vm.$reused

src/viewmodel.js

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -131,37 +131,32 @@ def(VMProto, '$appendTo', function (target, cb) {
131131
})
132132

133133
def(VMProto, '$remove', function (cb) {
134-
var el = this.$el,
135-
parent = el.parentNode
136-
if (!parent) return
134+
var el = this.$el
137135
transition(el, -1, function () {
138-
parent.removeChild(el)
136+
if (el.parentNode) {
137+
el.parentNode.removeChild(el)
138+
}
139139
if (cb) nextTick(cb)
140140
}, this.$compiler)
141141
})
142142

143143
def(VMProto, '$before', function (target, cb) {
144144
target = query(target)
145-
var el = this.$el,
146-
parent = target.parentNode
147-
if (!parent) return
145+
var el = this.$el
148146
transition(el, 1, function () {
149-
parent.insertBefore(el, target)
147+
target.parentNode.insertBefore(el, target)
150148
if (cb) nextTick(cb)
151149
}, this.$compiler)
152150
})
153151

154152
def(VMProto, '$after', function (target, cb) {
155153
target = query(target)
156-
var el = this.$el,
157-
parent = target.parentNode,
158-
next = target.nextSibling
159-
if (!parent) return
154+
var el = this.$el
160155
transition(el, 1, function () {
161-
if (next) {
162-
parent.insertBefore(el, next)
156+
if (target.nextSibling) {
157+
target.parentNode.insertBefore(el, target.nextSibling)
163158
} else {
164-
parent.appendChild(el)
159+
target.parentNode.appendChild(el)
165160
}
166161
if (cb) nextTick(cb)
167162
}, this.$compiler)

0 commit comments

Comments
 (0)