wasmoon // pages/todolist.lua data-lua-module="pages/todolist"
source
local items, setItems = reactive.signal({})
local draft, setDraft = reactive.signal("")

local function addItem()
    local d = draft()
    if d == "" then return end
    local copy = {}
    for i, v in ipairs(items()) do copy[i] = v end
    copy[#copy+1] = d
    setItems(copy)
    setDraft("")
end

reactive.effect(function()
    list.innerHTML = ""
    for _, v in ipairs(items()) do
        dom.append(list, h("li", {}, v))
    end
end)

Two signals + one effect. The effect tears down and rebuilds the list whenever the items signal mutates.