58 lines
1.2 KiB
Nim
58 lines
1.2 KiB
Nim
include karaxprelude
|
|
import future, sequtils
|
|
|
|
type
|
|
CustomRef = ref object of VComponent
|
|
|
|
method onAttach(r: CustomRef) =
|
|
kout(cstring"custom ref attached")
|
|
|
|
method onDetach(r: CustomRef) =
|
|
kout(cstring"custom ref detached")
|
|
|
|
var
|
|
modelData = @[5, 2, 4]
|
|
|
|
refA = VComponent()
|
|
refB = VComponent()
|
|
refC = CustomRef()
|
|
refSeq = newSeq[VComponent]()
|
|
|
|
proc onClick(ev: Event, n: VNode) =
|
|
modelData.add(0)
|
|
|
|
proc showRefs() =
|
|
kout(refA)
|
|
kout(refB)
|
|
kout(refC)
|
|
for i in 0 ..< refSeq.len:
|
|
kout(refSeq[i].vnode)
|
|
#kout(refSeq.map(nref => nref.vnode))
|
|
|
|
proc secureRefSlot(i: int): VComponent =
|
|
while refSeq.len <= i:
|
|
refSeq.add(VComponent())
|
|
result = refSeq[i]
|
|
|
|
proc view(): VNode =
|
|
result = buildHtml():
|
|
tdiv:
|
|
button(onclick=onClick):
|
|
text "click me"
|
|
# storing refs to single elements is straightforward now
|
|
if modelData.len mod 2 == 0:
|
|
tdiv(nref=refA):
|
|
text "A"
|
|
tdiv(nref=refB):
|
|
text "B"
|
|
tdiv(nref=refC):
|
|
text "C"
|
|
# It's a bit more tricky when containers are involved:
|
|
for i, x in modelData.pairs:
|
|
tdiv(nref=secureRefSlot(i)):
|
|
text "List item: " & $x
|
|
|
|
proc renderer(): VNode =
|
|
view()
|
|
|
|
setRenderer(renderer, "ROOT", showRefs)
|