Web Components Nested Rerender
Published on 26 July 2023
I have this idea, that if I build something "not at work", but, so to say, "for kicks", then I should not use dependencies and implement every little thing myself. Why? Simply because I believe that nothing a simple side project requires is too complicated to write yourself, and because achieving most of the same things that are possible with dependencies without them is a great way to learn the principles and ideas behind the said dependencies.
For example, I am constantly building and rebuilding a CMS for smaller projects. The idea behind it is to give the website owners (non-programming folks) convenience of Wordpress Admin, but without the owners having to pay for hosting. I am achieving this by building a light admin interface, that allows:
For example, I am constantly building and rebuilding a CMS for smaller projects. The idea behind it is to give the website owners (non-programming folks) convenience of Wordpress Admin, but without the owners having to pay for hosting. I am achieving this by building a light admin interface, that allows:
- user authentication and editing access by using a GitHub account
- CRUD on a schema defined data
For the first version I used Preact and its hooks for data management, but I am not happy with that, as I’d like to implement the component framework myself or not use one at all.
I want to learn web components and see whether they can allow the things I find ergonomic for writing UI. So, I attempt to rewrite my first version of the admin UI using web components.
Generally I want an easy way to:
I want to learn web components and see whether they can allow the things I find ergonomic for writing UI. So, I attempt to rewrite my first version of the admin UI using web components.
Generally I want an easy way to:
- create a state store
- subscribe to its changes
- rerender the views based on these
- provide the views with a way to trigger changes on the state
I need to be able to express the following
const state = new Store({ isAuthorised: false, menu: [{ path: '/', title: 'Home', path: '/products', title: 'Products' }], pages: [], }) class AppView extends Component { onAuthorise() { state.isAuthorised = true; } template({isAuthorised}) { // using HTML template could be better, // because that way HTML parser is used and not a simple // string concantenation return `<div>${isAuthorised ? `auth’d` : `<button></button>` }</div>` } events: { 'onClick button': this.buttonOnClick }, } const view = new View(state); state.on('datachange', (event) => { view.rerender(event.changed); });