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
componentsIdentical, different, similar, identical, usenewNode
DifferEnum = enum
deKind, deId, deIndex, deText, deComponent, deClass,
deSimilar
when defined(profileKarax):
type
DifferEnum = enum
deKind, deId, deIndex, deText, deComponent, deClass,
deSimilar
var
reasons: array[DifferEnum, int]
@ -227,6 +228,9 @@ proc eq(a, b: VNode): EqResult =
if a.text != b.text:
when defined(profileKarax): inc reasons[deComponent]
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:
when defined(profileKarax): inc reasons[deComponent]
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 =
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
for i in 0..<v.events.len:
if v.events[i][0] == kind:
v.events[i][1] = handler
#v.events[i][1] = handler
return
v.events.add((kind, handler, nil))
proc mergeEvents*(v: VNode; handlers: EventHandlers) =
## 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 =
## The default implementation of 'changed'.

View file

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