From a1a7038e55b0f058f5f86d06479d6a7c1f46c8e1 Mon Sep 17 00:00:00 2001 From: Isiah Meadows Date: Fri, 1 Sep 2017 17:06:19 -0400 Subject: [PATCH] Rework event diffing for better optimizability Re-ordered the type checks so that I can avoid polymorphic property lookups in event updates. (It improved the common case of no change by a little over ~40%.) --- render/render.js | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/render/render.js b/render/render.js index 8cc2efb4..d8de6e0d 100644 --- a/render/render.js +++ b/render/render.js @@ -593,14 +593,19 @@ module.exports = function($window) { //event function updateEvent(vnode, key, value) { - if (typeof value === "function" || value != null && typeof value === "object") { - if (vnode.events == null) vnode.events = new EventDict() + if (vnode.events != null) { if (vnode.events[key] === value) return - if (vnode.events[key] == null) vnode.dom.addEventListener(key.slice(2), vnode.events, false) + if (value != null && (typeof value === "function" || typeof value === "object")) { + if (vnode.events[key] == null) vnode.dom.addEventListener(key.slice(2), vnode.events, false) + vnode.events[key] = value + } else { + if (vnode.events[key] != null) vnode.dom.removeEventListener(key.slice(2), vnode.events, false) + vnode.events[key] = undefined + } + } else if (value != null && (typeof value === "function" || typeof value === "object")) { + vnode.events = new EventDict() + vnode.dom.addEventListener(key.slice(2), vnode.events, false) vnode.events[key] = value - } else if (vnode.events != null) { - if (vnode.events[key] != null) vnode.dom.removeEventListener(key.slice(2), vnode.events, false) - delete vnode.events[key] } }