Skip to content

Instantly share code, notes, and snippets.

@henriquegogo
Last active April 3, 2025 20:20
Show Gist options
  • Select an option

  • Save henriquegogo/0fb36f804b57c029ba4a7b19280bc040 to your computer and use it in GitHub Desktop.

Select an option

Save henriquegogo/0fb36f804b57c029ba4a7b19280bc040 to your computer and use it in GitHub Desktop.
Create HTML Elements with arguments and nested children
const ElementBuilder = new Proxy({}, {
get: (_, tagName) => function(...args) {
const element = Object.assign(document.createElement(tagName), ...args);
element.append(...args.filter(arg => arg.constructor !== Object));
return element;
}
});
const EventManager = (element, fn) => ({
update: props => element.replaceWith(fn(props)),
listen: (eventType, handler) => (element.dataset.event = "", element)
.addEventListener(eventType, ({ detail }) => handler(detail)),
dispatch: (eventType, detail) => document.querySelectorAll("[data-event]")
.forEach(el => el.dispatchEvent(new CustomEvent(eventType, { detail })))
});
const { div, h1 } = ElementBuilder;
function HelloWorld(message = 'Hello World!') {
const element = div(
h1({
className: 'hello-world',
onclick: () => dispatch('newdata', 'Bye bye')
}, message),
() => console.log('after'));
const { update, listen, dispatch } = EventManager(element, HelloWorld);
listen('newdata', update);
listen('newdata', () => console.log('gotcha!'));
return element;
}
document.body.append(HelloWorld());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment