Public
Edited
May 14, 2023
Insert cell
Insert cell
Insert cell
render(jsx`<${MyComponent} />`)
Insert cell
Insert cell
myMessage = signals.signal("Hello world!")
Insert cell
function MyComponent() {
const msg = useSignals(() => myMessage.value);
const updateMessage = (ev) => {
myMessage.value = ev.target.value;
};
return jsx`<div>
<div><em>${msg}</em></div>
<input onChange=${updateMessage} value=${msg} />
</div>`;
}
Insert cell
Insert cell
Insert cell
Insert cell
observeSignals(myMessage)
Insert cell
Insert cell
observeSignals(() => (myMessage.value || "").toUpperCase())
Insert cell
Insert cell
inputSignals(Inputs.text({ label: "Change signal with Inputs:" }), myMessage)
Insert cell
Insert cell
function useSignals(compute = () => {}) {
const f = typeof compute === "function" ? compute : () => compute.value;
const [value, setValue] = React.useState(f);
React.useEffect(() => signals.effect(() => setValue(f())), []);
return value;
}
Insert cell
Insert cell
async function* observeSignals(signal) {
const f = typeof signal === "function" ? signal : () => signal.value;
yield* Generators.observe((notify) => signals.effect(() => notify(f())));
}

Insert cell
function inputSignals(input, signal) {
const update = () => (input.value = signal.value);
const cleanup = signals.effect(update);
const listener = () => signal.value = input.value;
input.addEventListener("input", listener);
Inputs.disposal(input).then(() => {
input.removeEventListener("input", listener);
cleanup();
});
update();
return input;
}
Insert cell
Insert cell
function render(component) {
const elem = document.createElement("div");
const root = ReactDOM.createRoot(elem);
if (typeof component === "function") {
component = React.createElement(component);
}
root.render(component);
Inputs.disposal(elem).then(() => root.unmount());
return elem;
}
Insert cell
signals = import("@preact/signals-core")
Insert cell
jsx = htm.bind(React.createElement)
Insert cell
htm = (await import("htm")).default
Insert cell
React = require("react@latest/umd/react.development.js")
Insert cell
ReactDOM = await require.alias({
react: React
})("react-dom@latest/umd/react-dom.development.js")
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more