Skip to content

Commit df1e407

Browse files
kfuledead-claudia
authored andcommitted
Avoid redraw after dom removal
1 parent b454e9a commit df1e407

File tree

2 files changed

+49
-4
lines changed

2 files changed

+49
-4
lines changed

render/render.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,7 @@ module.exports = function() {
626626
if (typeof vnode.tag !== "string") {
627627
if (vnode.instance != null) onremove(vnode.instance)
628628
} else {
629+
if (vnode.events != null) vnode.events._ = null
629630
var children = vnode.children
630631
if (Array.isArray(children)) {
631632
for (var i = 0; i < children.length; i++) {
@@ -810,12 +811,12 @@ module.exports = function() {
810811
var result
811812
if (typeof handler === "function") result = handler.call(ev.currentTarget, ev)
812813
else if (typeof handler.handleEvent === "function") handler.handleEvent(ev)
813-
var eventRedraw = this._
814-
if (eventRedraw) {
815-
if (ev.redraw !== false) eventRedraw()
814+
var self = this
815+
if (self._ != null) {
816+
if (ev.redraw !== false) (0, self._)()
816817
if (result != null && typeof result.then === "function") {
817818
Promise.resolve(result).then(function () {
818-
if (ev.redraw !== false) eventRedraw()
819+
if (self._ != null && ev.redraw !== false) (0, self._)()
819820
})
820821
}
821822
}

render/tests/test-event.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -916,4 +916,48 @@ o.spec("event", function() {
916916
})
917917
})
918918
})
919+
o("avoid sync redraw after removal", function() {
920+
var div = m("div", {onclick: function () {}})
921+
var e = $window.document.createEvent("MouseEvents")
922+
e.initEvent("click", true, true)
923+
924+
render(root, div)
925+
// remove div
926+
render(root, [])
927+
928+
div.dom.dispatchEvent(e)
929+
930+
o(redraw.callCount).equals(0)
931+
})
932+
o("avoid async redraw after removal", function(done) {
933+
var thenCB
934+
var div = m("div", {onclick: async function () {
935+
await new Promise(function(resolve){thenCB = resolve})
936+
}})
937+
var e = $window.document.createEvent("MouseEvents")
938+
e.initEvent("click", true, true)
939+
940+
render(root, div)
941+
div.dom.dispatchEvent(e)
942+
943+
o(redraw.callCount).equals(1)
944+
o(redraw.this).equals(undefined)
945+
o(redraw.args.length).equals(0)
946+
947+
callAsync(function() {
948+
// not resolved yet
949+
o(redraw.callCount).equals(1)
950+
951+
// remove div
952+
render(root, [])
953+
954+
// resolve
955+
thenCB()
956+
callAsync(function() {
957+
o(redraw.callCount).equals(1)
958+
959+
done()
960+
})
961+
})
962+
})
919963
})

0 commit comments

Comments
 (0)