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
|
EqResult = enum
|
||||||
componentsIdentical, different, similar, identical, usenewNode
|
componentsIdentical, different, similar, identical, usenewNode
|
||||||
|
|
||||||
|
when defined(profileKarax):
|
||||||
|
type
|
||||||
DifferEnum = enum
|
DifferEnum = enum
|
||||||
deKind, deId, deIndex, deText, deComponent, deClass,
|
deKind, deId, deIndex, deText, deComponent, deClass,
|
||||||
deSimilar
|
deSimilar
|
||||||
|
|
||||||
when defined(profileKarax):
|
|
||||||
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
|
||||||
|
|
|
||||||
|
|
@ -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'.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue