fix lifecycle in unkeyed child of recycled keyed
This commit is contained in:
parent
8feb6d3b39
commit
0d9a51fe37
3 changed files with 32 additions and 5 deletions
|
|
@ -475,14 +475,13 @@ var coreRenderer = function($window) {
|
||||||
if (old[i] === vnodes[i]) continue
|
if (old[i] === vnodes[i]) continue
|
||||||
else if (old[i] == null && vnodes[i] != null) createNode(parent, vnodes[i], hooks, ns, getNextSibling(old, i + 1, nextSibling))
|
else if (old[i] == null && vnodes[i] != null) createNode(parent, vnodes[i], hooks, ns, getNextSibling(old, i + 1, nextSibling))
|
||||||
else if (vnodes[i] == null) removeNodes(old, i, i + 1, vnodes)
|
else if (vnodes[i] == null) removeNodes(old, i, i + 1, vnodes)
|
||||||
else updateNode(parent, old[i], vnodes[i], hooks, getNextSibling(old, i + 1, nextSibling), false, ns)
|
else updateNode(parent, old[i], vnodes[i], hooks, getNextSibling(old, i + 1, nextSibling), recycling, ns)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
recycling = recycling || isRecyclable(old, vnodes)
|
recycling = recycling || isRecyclable(old, vnodes)
|
||||||
if (recycling) old = old.concat(old.pool)
|
if (recycling) old = old.concat(old.pool)
|
||||||
|
|
||||||
var oldStart = 0, start = 0, oldEnd = old.length - 1, end = vnodes.length - 1, map
|
var oldStart = 0, start = 0, oldEnd = old.length - 1, end = vnodes.length - 1, map
|
||||||
while (oldEnd >= oldStart && end >= start) {
|
while (oldEnd >= oldStart && end >= start) {
|
||||||
var o = old[oldStart], v = vnodes[start]
|
var o = old[oldStart], v = vnodes[start]
|
||||||
|
|
|
||||||
|
|
@ -141,7 +141,7 @@ module.exports = function($window) {
|
||||||
if (old[i] === vnodes[i]) continue
|
if (old[i] === vnodes[i]) continue
|
||||||
else if (old[i] == null && vnodes[i] != null) createNode(parent, vnodes[i], hooks, ns, getNextSibling(old, i + 1, nextSibling))
|
else if (old[i] == null && vnodes[i] != null) createNode(parent, vnodes[i], hooks, ns, getNextSibling(old, i + 1, nextSibling))
|
||||||
else if (vnodes[i] == null) removeNodes(old, i, i + 1, vnodes)
|
else if (vnodes[i] == null) removeNodes(old, i, i + 1, vnodes)
|
||||||
else updateNode(parent, old[i], vnodes[i], hooks, getNextSibling(old, i + 1, nextSibling), false, ns)
|
else updateNode(parent, old[i], vnodes[i], hooks, getNextSibling(old, i + 1, nextSibling), recycling, ns)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ o.spec("render", function() {
|
||||||
|
|
||||||
o(threwOuter).equals(true)
|
o(threwOuter).equals(true)
|
||||||
})
|
})
|
||||||
o("lifecycle methods work in children of recycled", function() {
|
o("lifecycle methods work in keyed children of recycled keyed", function() {
|
||||||
var createA = o.spy()
|
var createA = o.spy()
|
||||||
var updateA = o.spy()
|
var updateA = o.spy()
|
||||||
var removeA = o.spy()
|
var removeA = o.spy()
|
||||||
|
|
@ -78,6 +78,34 @@ o.spec("render", function() {
|
||||||
render(root, b())
|
render(root, b())
|
||||||
render(root, a())
|
render(root, a())
|
||||||
|
|
||||||
|
o(createA.callCount).equals(2)
|
||||||
|
o(updateA.callCount).equals(0)
|
||||||
|
o(removeA.callCount).equals(1)
|
||||||
|
o(createB.callCount).equals(1)
|
||||||
|
o(updateB.callCount).equals(0)
|
||||||
|
o(removeB.callCount).equals(1)
|
||||||
|
})
|
||||||
|
o("lifecycle methods work in unkeyed children of recycled keyed", function() {
|
||||||
|
var createA = o.spy()
|
||||||
|
var updateA = o.spy()
|
||||||
|
var removeA = o.spy()
|
||||||
|
var createB = o.spy()
|
||||||
|
var updateB = o.spy()
|
||||||
|
var removeB = o.spy()
|
||||||
|
var a = function() {
|
||||||
|
return {tag: "div", key: 1, children: [
|
||||||
|
{tag: "div", attrs: {oncreate: createA, onupdate: updateA, onremove: removeA}},
|
||||||
|
]}
|
||||||
|
}
|
||||||
|
var b = function() {
|
||||||
|
return {tag: "div", key: 2, children: [
|
||||||
|
{tag: "div", attrs: {oncreate: createB, onupdate: updateB, onremove: removeB}},
|
||||||
|
]}
|
||||||
|
}
|
||||||
|
render(root, a())
|
||||||
|
render(root, b())
|
||||||
|
render(root, a())
|
||||||
|
|
||||||
o(createA.callCount).equals(2)
|
o(createA.callCount).equals(2)
|
||||||
o(updateA.callCount).equals(0)
|
o(updateA.callCount).equals(0)
|
||||||
o(removeA.callCount).equals(1)
|
o(removeA.callCount).equals(1)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue