create messy reactivity-ish test stuff.
(it works but it's messy.)
This commit is contained in:
parent
975cde8a31
commit
8e3aa4228c
20
src/core.mjs
20
src/core.mjs
|
@ -12,7 +12,7 @@ export function json_as_html (json, state = new Map()) {
|
|||
}
|
||||
|
||||
if (typeof json === "function") {
|
||||
return json_as_html(json(state), state);
|
||||
return from_function(json, state);
|
||||
}
|
||||
|
||||
const [type, attributes = [], children = []] = json;
|
||||
|
@ -32,3 +32,21 @@ export function json_as_html (json, state = new Map()) {
|
|||
|
||||
return elem;
|
||||
}
|
||||
|
||||
// these two functions are pretty messy.
|
||||
function from_function (fn, state) {
|
||||
const [after, has_run_after] = delayed(fn => elem => fn(elem));
|
||||
const initial = json_as_html(fn(state, after), state);
|
||||
if (has_run_after()) after(initial);
|
||||
return initial;
|
||||
}
|
||||
function delayed (fn) {
|
||||
let has_run_once = false;
|
||||
let initial_result = undefined;
|
||||
return [(...args) => {
|
||||
if (has_run_once) return initial_result(...args);
|
||||
has_run_once = true;
|
||||
initial_result = fn(...args);
|
||||
return initial_result;
|
||||
}, _ => has_run_once];
|
||||
}
|
||||
|
|
25
src/demo.mjs
25
src/demo.mjs
|
@ -15,10 +15,16 @@ const demo = [
|
|||
state => ["button", [
|
||||
["onclick", _ => {
|
||||
state.set("clicked", true);
|
||||
render();
|
||||
trigger_event("button_pressed");
|
||||
}]
|
||||
], "it can even do buttons!"],
|
||||
state => ["p", [], state.get("clicked") ? "clicked" : "not clicked"],
|
||||
(state, after) => {
|
||||
// this is very messy.
|
||||
const generate = _ => ["p", [], state.get("clicked") ? "clicked" : "not clicked"];
|
||||
after(elem => listen_event("button_pressed", _ => elem.replaceWith(json_as_html(generate(), state))));
|
||||
|
||||
return generate();
|
||||
},
|
||||
["ul",
|
||||
[],
|
||||
[
|
||||
|
@ -29,11 +35,22 @@ const demo = [
|
|||
],
|
||||
];
|
||||
|
||||
const state = new Map();
|
||||
let event_listeners = new Map();
|
||||
|
||||
function trigger_event (name) {
|
||||
if (event_listeners.has(name)) {
|
||||
event_listeners.get(name).forEach(fn => fn());
|
||||
}
|
||||
}
|
||||
|
||||
function listen_event (name, fn) {
|
||||
if (!event_listeners.has(name)) event_listeners.set(name, []);
|
||||
event_listeners.get(name).push(fn);
|
||||
}
|
||||
|
||||
function render () {
|
||||
document.body.innerHTML = "";
|
||||
document.body.appendChild(json_as_html(demo, state));
|
||||
document.body.appendChild(json_as_html(demo));
|
||||
}
|
||||
|
||||
render();
|
||||
|
|
Loading…
Reference in New Issue