1
0
mirror of https://github.com/jaandrle/deka-dom-el synced 2025-07-01 12:22:15 +02:00
This commit is contained in:
2024-06-03 16:20:42 +02:00
parent 57fb9512ee
commit 97f8c2eed3
7 changed files with 60 additions and 48 deletions

File diff suppressed because one or more lines are too long

View File

@ -4,7 +4,7 @@ S===signal
/** @type {ddeSignal} */ /** @type {ddeSignal} */
/** @type {ddeAction} */ /** @type {ddeAction} */
/** @type {ddeActions} */ /** @type {ddeActions} */
</code></div><h3 id="h-introducing-signals"><!--<dde:mark type="component" name="h3" host="parentElement" ssr/>--><a href="#h-introducing-signals" tabindex="-1">#</a> Introducing signals</h3><p>Using signals, we split program logic into the&nbsp;three parts. Firstly (α), we create a&nbsp;variable (constant) representing reactive value. Somewhere later, we can register (β) a&nbsp;logic reacting to the&nbsp;signal value changes. Similarly, in a&nbsp;remaining part (γ), we can update the&nbsp;signal value. </p><!--<dde:mark type="component" name="example" host="this" ssr/>--><div id="code-example-1-1gy5flu0x85c" class="example"><!--<dde:mark type="component" name="code" host="parentElement" ssr/>--><code class="language-js">import { S } from "./esm-with-signals.js"; </code></div><h3 id="h-introducing-signals"><!--<dde:mark type="component" name="h3" host="parentElement" ssr/>--><a href="#h-introducing-signals" tabindex="-1">#</a> Introducing signals</h3><p>Lets re-introduce <a href="./#h-event-driven-programming--parts-separation--ps">3PS principle</a>.</p><p>Using signals, we split program logic into the&nbsp;three parts. Firstly (α), we create a&nbsp;variable (constant) representing reactive value. Somewhere later, we can register (β) a&nbsp;logic reacting to the&nbsp;signal value changes. Similarly, in a&nbsp;remaining part (γ), we can update the&nbsp;signal value. </p><!--<dde:mark type="component" name="example" host="this" ssr/>--><div id="code-example-1-1gy5flu0x85c" class="example"><!--<dde:mark type="component" name="code" host="parentElement" ssr/>--><code class="language-js">import { S } from "./esm-with-signals.js";
// α — `signal` represents a&nbsp;reactive value // α — `signal` represents a&nbsp;reactive value
const signal= S(0); const signal= S(0);
// β — just reacts on signal changes // β — just reacts on signal changes

View File

@ -1,3 +1,4 @@
// pseudo code!
const onchage= const onchage=
event=> event=>
console.log("Reacting to the:", event); // A console.log("Reacting to the:", event); // A

View File

@ -1,15 +1,15 @@
import { el } from "deka-dom-el"; import { el } from "deka-dom-el";
import { S } from "deka-dom-el/signals"; import { S } from "deka-dom-el/signals";
const clicks= S(0); const clicks= S(0); // A
document.body.append( document.body.append(
el().append( el().append(
el("p", S(()=> el("p", S(()=>
"Hello World "+"🎉".repeat(clicks()) "Hello World "+"🎉".repeat(clicks()) // B
)), )),
el("button", { el("button", {
type: "button", type: "button",
onclick: ()=> clicks(clicks()+1), onclick: ()=> clicks(clicks()+1), // C
textContent: "Fire" textContent: "Fire",
}) })
) )
); );

View File

@ -13,6 +13,14 @@ import { code } from "./components/code.html.js";
/** @param {string} url */ /** @param {string} url */
const fileURL= url=> new URL(url, import.meta.url); const fileURL= url=> new URL(url, import.meta.url);
const references= { const references= {
w_mvv:{
title: t`Wikipedia: Modelviewviewmodel`,
href: "https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel",
},
w_mvc: {
title: t`Wikipedia: Modelviewcontroller`,
href: "https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller",
},
}; };
/** @param {import("./types.d.ts").PageAttrs} attrs */ /** @param {import("./types.d.ts").PageAttrs} attrs */
export function page({ pkg, info }){ export function page({ pkg, info }){
@ -25,29 +33,27 @@ export function page({ pkg, info }){
a starting point. a starting point.
`), `),
el(code, { src: fileURL("./components/examples/introducing/3ps.js"), page_id }), el(code, { src: fileURL("./components/examples/introducing/3ps.js"), page_id }),
el("p").append(t`
As we can see, in the code at location “A” we define how to react when the function is called with
any event as an argument. At that moment, we don't care who/why/how the function was called. Similarly,
at point “B”, we reference to a function to be called on the event without caring what the function will
do at that time. Finally, at point “C”, we tell the application that a change has occurred, in the input,
and we don't care if/how someone is listening for the event.
`),
el("p").append(...T` el("p").append(...T`
We start with creating and modifying a static elements and end up with UI templates. As we can see, in the code at location “A” we define ${el("em", t`how to react`)} when the function
${el("em").append(...T`From ${el("code", "document.createElement")} to ${el("code", "el")}.`)}. is called with any event as an argument. At that moment, we ${el("em", t`don't care who/why/how`)}
Then we go through the native events system and the way to include it declaratively in UI templates. the function was called. Similarly, at point “B”, we reference to a function to be called on the event
${el("em").append(...T`From ${el("code", "element.addEventListener")} to ${el("code", "on")}.`)} ${el("em", t`without caring`)} what the function will do at that time. Finally, at point “C”, we tell
`), the application that a change has occurred, in the input, and we ${el("em", t`don't care if/how someone`)}
el("p").append(...T` is listening for the event.
Next step is providing interactivity not only for our UI templates.
We introduce signals (${el("code", "S")}) and how them incorporate to UI templates.
`),
el("p").append(...T`
Now we will clarify how the signals are incorporated into our templates with regard to application
performance. This is not the only reason the library uses ${el("code", "scope")}s. We will look at
how they work in components represented in JavaScript by functions.
`), `),
el(example, { src: fileURL("./components/examples/introducing/helloWorld.js"), page_id }), el(example, { src: fileURL("./components/examples/introducing/helloWorld.js"), page_id }),
el("p").append(...T`
The library introduces a new “type” of variable/constant called ${el("em", t`signal`)} allowing us to
to use introduced 3PS pattern in our applications. As you can see it in the example above.
`),
el("p").append(...T`
Also please notice that there is very similar 3PS pattern used for separate creation of UI and business logic.
`),
el("p").append(...T`
The 3PS is very simplified definition of the pattern. There are more deep/academic definitions more precisely
describe usage in specific situations, see for example ${el("a", { textContent: t`MVVM`, ...references.w_mvv })}
or ${el("a", { textContent: t`MVC`, ...references.w_mvc })}.
`),
el(h3, t`Organization of the documentation`),
); );
} }

View File

@ -51,6 +51,10 @@ export function page({ pkg, info }){
el(code, { src: fileURL("./components/examples/signals/intro.js"), page_id }), el(code, { src: fileURL("./components/examples/signals/intro.js"), page_id }),
el(h3, t`Introducing signals`), el(h3, t`Introducing signals`),
el("p").append(...T`
Lets re-introduce
${el("a", { textContent: t`3PS principle`, href: "./#h-event-driven-programming--parts-separation--ps" })}.
`),
el("p").append(...T` el("p").append(...T`
Using signals, we split program logic into the three parts. Firstly (α), we create a variable (constant) Using signals, we split program logic into the three parts. Firstly (α), we create a variable (constant)
representing reactive value. Somewhere later, we can register (β) a logic reacting to the signal value representing reactive value. Somewhere later, we can register (β) a logic reacting to the signal value

View File

@ -1,6 +1,7 @@
import { T, t } from "./utils/index.js";
export const info= { export const info= {
title: "Custom elements", title: t`Custom elements`,
description: "Using custom elements in combinantion with DDE", description: t`Using custom elements in combinantion with DDE`,
}; };
import { el } from "deka-dom-el"; import { el } from "deka-dom-el";
@ -14,12 +15,12 @@ const fileURL= url=> new URL(url, import.meta.url);
const references= { const references= {
/** Custom Elements on MDN */ /** Custom Elements on MDN */
custom_elements: { custom_elements: {
title: "MDN documentation page for Custom Elements", title: t`MDN documentation page for Custom Elements`,
href: "https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_custom_elements", href: "https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_custom_elements",
}, },
/** Custom Elements tips from WebReflection */ /** Custom Elements tips from WebReflection */
custom_elements_tips: { custom_elements_tips: {
title: "Ideas and tips from WebReflection", title: t`Ideas and tips from WebReflection`,
href: "https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4", href: "https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4",
} }
}; };
@ -27,20 +28,19 @@ const references= {
export function page({ pkg, info }){ export function page({ pkg, info }){
const page_id= info.id; const page_id= info.id;
return el(simplePage, { info, pkg }).append( return el(simplePage, { info, pkg }).append(
el("h2", "Using custom elements in combinantion with DDE"), el("h2", t`Using custom elements in combinantion with DDE`),
el("p").append( el("p").append(...T`
`),
),
el(code, { src: fileURL("./components/examples/customElement/intro.js"), page_id }), el(code, { src: fileURL("./components/examples/customElement/intro.js"), page_id }),
el(h3, "Custom Elements Introduction"), el(h3, t`Custom Elements Introduction`),
el("p").append( el("p").append(...T`
el("a", { textContent: "Using custom elements", ...references.custom_elements }) ${el("a", { textContent: t`Using custom elements`, ...references.custom_elements })}
), `),
el(code, { src: fileURL("./components/examples/customElement/native-basic.js"), page_id }), el(code, { src: fileURL("./components/examples/customElement/native-basic.js"), page_id }),
el("p").append( el("p").append(...T`
el("a", { textContent: "Handy Custom Elements' Patterns", ...references.custom_elements_tips }) ${el("a", { textContent: t`Handy Custom Elements' Patterns`, ...references.custom_elements_tips })}
), `),
el(mnemonic) el(mnemonic)
); );