better event merging for components

This commit is contained in:
Andreas Rumpf 2017-07-12 12:23:24 +02:00
commit 2ced690387
3 changed files with 12 additions and 8 deletions

View file

@ -190,11 +190,12 @@ type
EqResult = enum EqResult = enum
componentsIdentical, different, similar, identical, usenewNode componentsIdentical, different, similar, identical, usenewNode
DifferEnum = enum
deKind, deId, deIndex, deText, deComponent, deClass,
deSimilar
when defined(profileKarax): when defined(profileKarax):
type
DifferEnum = enum
deKind, deId, deIndex, deText, deComponent, deClass,
deSimilar
var var
reasons: array[DifferEnum, int] reasons: array[DifferEnum, int]
@ -227,6 +228,9 @@ proc eq(a, b: VNode): EqResult =
if a.text != b.text: if a.text != b.text:
when defined(profileKarax): inc reasons[deComponent] when defined(profileKarax): inc reasons[deComponent]
return different return different
if VComponent(a).key.isNil and VComponent(b).key.isNil:
when defined(profileKarax): inc reasons[deComponent]
return different
if VComponent(a).key != VComponent(b).key: if VComponent(a).key != VComponent(b).key:
when defined(profileKarax): inc reasons[deComponent] when defined(profileKarax): inc reasons[deComponent]
return different return different

View file

@ -160,17 +160,17 @@ proc vthunk*(name: cstring; args: varargs[VNode, vn]): VNode =
proc dthunk*(name: cstring; args: varargs[VNode, vn]): VNode = proc dthunk*(name: cstring; args: varargs[VNode, vn]): VNode =
VNode(kind: VNodeKind.dthunk, text: name, index: -1, kids: @args) VNode(kind: VNodeKind.dthunk, text: name, index: -1, kids: @args)
proc setEvent(v: VNode; kind: EventKind; handler: EventHandler) = proc setEventIfNoConflict(v: VNode; kind: EventKind; handler: EventHandler) =
assert handler != nil assert handler != nil
for i in 0..<v.events.len: for i in 0..<v.events.len:
if v.events[i][0] == kind: if v.events[i][0] == kind:
v.events[i][1] = handler #v.events[i][1] = handler
return return
v.events.add((kind, handler, nil)) v.events.add((kind, handler, nil))
proc mergeEvents*(v: VNode; handlers: EventHandlers) = proc mergeEvents*(v: VNode; handlers: EventHandlers) =
## Overrides or adds the event handlers to `v`'s internal event handler list. ## Overrides or adds the event handlers to `v`'s internal event handler list.
for h in handlers: v.setEvent(h[0], h[1]) for h in handlers: v.setEventIfNoConflict(h[0], h[1])
proc defaultChangedImpl*(v, newInstance: VComponent): bool = proc defaultChangedImpl*(v, newInstance: VComponent): bool =
## The default implementation of 'changed'. ## The default implementation of 'changed'.

View file

@ -115,7 +115,7 @@ proc createDom(): VNode =
renderPerson(text, index) renderPerson(text, index)
tdiv: tdiv:
newTextInput(VStyle(), &persons.len, ""): newTextInput(VStyle(), &persons.len, ""):
proc onkeyuplater(ev: Event; n: VNode) = proc onkeyupenter(ev: Event; n: VNode) =
let v = n.value let v = n.value
if v.len > 0: if v.len > 0:
persons.add v persons.add v