um/src/app.js

53 lines
1.1 KiB
JavaScript
Raw Normal View History

2024-05-05 00:34:27 +00:00
export default function app(opts, selector = "body") {
// initial setup
let data = {};
let view = () => null;
let methods = {};
// query helper
const $ = document.querySelector.bind(document);
// state helper
const state = (state) => {
if(typeof state === "object") {
data = {...data, ...state};
}
// update ui
render();
// return current state
return data;
}
const render = () => {
$(selector).replaceChildren(view(data, methods));
}
// setup view
if (opts.view && typeof opts.view === "function") {
view = opts?.view;
}
// setup data
if (opts.data && typeof opts.data === "object") {
// wrap data in state object
data = state(opts.data);
}
// setup methods
if (opts.methods && typeof opts.methods === "object") {
methods = opts.methods;
}
// mount view
if (opts.view && selector) {
render();
}
return {
state,
methods,
};
}