Public
Edited
Apr 3
1 fork
Importers
Insert cell
Insert cell
Insert cell
Insert cell
render2 = render
Insert cell
render = (...args) => {
if (args.length < 3) {
throw new Error("`render` needs three arguments! (did you forget to pass `this` as #1?)");
}
let [component, props, element] = args;
if (!element) {
element = document.createElement('div');
element.reactRoot = createRoot(element);
}

// We provide `__element` as an extra prop so that components can access their element
// (to set an output value, etc).
element.reactRoot.render(React.createElement(component, {...props, __element: element}));
return element;
}
Insert cell
setObservableValue = (element, value) => {
element.value = value;
element.dispatchEvent(new CustomEvent('input'));
}
Insert cell
useObservableValue = (...args) => {
if (args.length < 2) {
throw new Error("`useObservableValue` needs two arguments; did you forget to pass __element as #1?");
}
const [element, value] = args;
React.useEffect(() => {
setObservableValue(element, value);
}, [element, value]);
}
Insert cell
Insert cell
Insert cell
MyInput = ({label, __element}) => {
const [value, setValue] = React.useState("");
useObservableValue(__element, value);
return jsx`<div>
<input
type="text"
value=${value}
onChange=${(ev) => setValue(ev.target.value)}
/>
${' ' + label}
</div>`
}
Insert cell
viewof text1 = render(MyInput, {label: 'provide label here'}, this)
Insert cell
viewof text2 = render(MyInput, {label: text1}, this)
Insert cell
Insert cell
viewof text1bad = render(MyInput, {label: 'provide label here'}, null)
Insert cell
viewof text2bad = render(MyInput, {label: text1bad}, null)
Insert cell
Insert cell
Insert cell
Insert cell
import { npm } from "@pkg/npm"
Insert cell
ReactDOMClient = npm("react-dom/client")
Insert cell
createRoot = ReactDOMClient.createRoot
Insert cell
import { React } from "@pkg/react"
Insert cell
Insert cell
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