Unlike frameworks that use reactive state objects, Karax reacts to events.
When an event handler (like onclick, keyup, or an AJAX call via karax/kajax) is triggered, Karax automatically triggers a redraw. A redraw calls the function passed to setRenderer, creates a new virtual DOM, compares it to the previous one (diffing), and applies the resulting patches to the real DOM.
If you are using non-standard events (like setInterval or WebSockets), you must manually trigger a redraw using the redraw(kxi) function to update the UI.
include karax/prelude
import karax/kdom except setInterval
# Wrapping setInterval to make it reactive
proc setInterval(cb: proc(), interval: int): Interval {.discardable.} =
kdom.setInterval(proc =
cb()
if not kxi.surpressRedraws: redraw(kxi)
, interval)
var v = 10
proc update = v += 10
setInterval(update, 200)
proc main: VNode =
buildHtml(tdiv):
text $v
setRenderer main