A framework that lets you write your entire UI
- as functions
- with React hooks
- without React
- without classes
- without vDOM/DOM diffing
- without web components
- without build step
| <html lang="en"> | |
| <head> | |
| <script src="https://unpkg.com/tng-hooks"></script> | |
| </head> | |
| <body> | |
| <div id="app1"></div> | |
| <div id="app2"></div> | |
| <script type="module"> | |
| // THE FRAMEWORK | |
| import { html, render } from 'https://unpkg.com/lit-html/lit-html.js'; | |
| const importFramework = () => { | |
| let rendering = null; | |
| var useTNGSetState = useState; | |
| function useCustomSetState(...args) { | |
| // actual state user wants to use | |
| var [state,setState] = useTNGSetState(...args); | |
| // note down the root component and mount element on first render | |
| var [rendererMeta] = useTNGSetState(rendering); | |
| return [ | |
| state, | |
| // any setState() call needs to re-render entire app | |
| (...args2) => { | |
| const result = setState(...args2); | |
| render( | |
| rendererMeta.componentToRender(), | |
| rendererMeta.target | |
| ); | |
| return result; | |
| } | |
| ]; | |
| }; | |
| const mount = (componentToRender, target) => { | |
| rendering = { | |
| componentToRender, | |
| target, | |
| }; | |
| render(componentToRender(), target); | |
| rendering = null; | |
| }; | |
| return { | |
| html, | |
| mount, | |
| component: TNG, | |
| useState: useCustomSetState, | |
| } | |
| }; | |
| // Framework done | |
| /** example usage of framework **/ | |
| (() => { | |
| const { | |
| component, | |
| html, | |
| mount, | |
| useState, | |
| } = importFramework(); | |
| function func() { | |
| const [count, setCount] = useState(0); | |
| return html` | |
| <div id="count">${count}</div> | |
| <button type="button" @click=${() => setCount(count + 1)}> | |
| Increment | |
| </button> | |
| `; | |
| } | |
| mount(component(func), document.getElementById('app1')); | |
| mount(component(func), document.getElementById('app2')); | |
| })(); | |
| </script> | |
| </body> | |
| </html> |