better event merging for components
This commit is contained in:
parent
e4d8cb4c20
commit
2ced690387
3 changed files with 12 additions and 8 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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'.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue