From b6bb63ff85726c649b5317da895e7c7763c0282b Mon Sep 17 00:00:00 2001 From: Pierre-Yves Gerardy Date: Sat, 6 Aug 2016 00:09:48 +0200 Subject: [PATCH] Skip diff for cached, non-keyed nodes fix #1206 --- render/render.js | 4 ++-- render/tests/test-updateNodes.js | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/render/render.js b/render/render.js index 5a83c388..bc224acf 100644 --- a/render/render.js +++ b/render/render.js @@ -109,7 +109,7 @@ module.exports = function($window) { //update function updateNodes(parent, old, vnodes, hooks, nextSibling, ns) { - if (old == null && vnodes == null) return + if (old === vnodes || old == null && vnodes == null) return else if (old == null) createNodes(parent, vnodes, 0, vnodes.length, hooks, nextSibling, undefined) else if (vnodes == null) removeNodes(parent, old, 0, old.length, vnodes) else { @@ -118,7 +118,7 @@ module.exports = function($window) { if (old.length === vnodes.length && vnodes[0] != null && vnodes[0].key == null) { for (var i = 0; i < old.length; i++) { - if (old[i] == null && vnodes[i] == null) continue + if (old[i] === vnodes[i] || old[i] == null && vnodes[i] == null) continue else if (old[i] == null) insertNode(parent, createNode(vnodes[i], hooks, ns), getNextSibling(old, i + 1, nextSibling)) else if (vnodes[i] == null) removeNodes(parent, old, i, i + 1, vnodes) else updateNode(parent, old[i], vnodes[i], hooks, getNextSibling(old, i + 1, nextSibling), recycling, ns) diff --git a/render/tests/test-updateNodes.js b/render/tests/test-updateNodes.js index a3c39394..b8468bc8 100644 --- a/render/tests/test-updateNodes.js +++ b/render/tests/test-updateNodes.js @@ -845,4 +845,22 @@ o.spec("updateNodes", function() { o(root.childNodes[0].nodeName).equals("A") o(root.childNodes[1].nodeName).equals("S") }) + o("cached, non-keyed nodes skip diff", function () { + var onupdate = o.spy(); + var cached = {tag:"a", attrs:{onupdate: onupdate}} + + render(root, cached) + render(root, cached) + + o(onupdate.callCount).equals(0) + }) + o("cached, keyed nodes skip diff", function () { + var onupdate = o.spy(); + var cached = {tag:"a", key:"a", attrs:{onupdate: onupdate}} + + render(root, cached) + render(root, cached) + + o(onupdate.callCount).equals(0) + }) })