DOMPP can enhance existing
server-rendered HTML while still using
optional fine-grained signals.
This combines:
setChildren(),
setEnhancement()
does not recreate or replace the DOM tree.
setText()
updates only text nodes
setStyles()
updates only inline styles
// =====================================
// SIGNAL
// =====================================
const [
count,
setCount
] = document
.createSignal(0);
// =====================================
// ENHANCE EXISTING DOM
// =====================================
document
.getElementById(
"counter-app"
)
.setFineGrained()
.setEnhancement(({
childNodes
}) => {
// =================================
// EXISTING NODES
// =================================
const countNode =
childNodes[1];
const descriptionNode =
childNodes[3];
const controls =
childNodes[5];
const incrementButton =
controls.childNodes[1];
const decrementButton =
controls.childNodes[3];
// =================================
// COUNT TEXT
// =================================
countNode
.setFineGrained()
.setText(() => {
return
count();
})
.setStyles(() => ({
color:
count() > 0
? "limegreen"
: count() < 0
? "tomato"
: "#222"
}));
// =================================
// DESCRIPTION
// =================================
descriptionNode
.setFineGrained()
.setText(() => (
`Current count: ${count()}`
))
.setStyles(() => ({
backgroundColor:
count() % 2 === 0
? "lightblue"
: "lightcoral",
color:
"#333",
padding:
"1em",
borderRadius:
"0.5em"
}));
// =================================
// BUTTONS
// =================================
incrementButton
.setEvents({
click() {
setCount(
count() + 1
);
}
});
decrementButton
.setEvents({
click() {
setCount(
count() - 1
);
}
});
});