dockview-solid
Version:
Zero dependency layout manager supporting tabs, grids and splitviews
39 lines (38 loc) • 1.27 kB
JavaScript
import { render } from 'solid-js/web';
import { createStore } from 'solid-js/store';
import { createComponent } from 'solid-js';
/**
* SolidJS replacement for ReactPart: mounts a Solid component into a DOM node and allows imperative prop updates.
*/
export class SolidPart {
constructor(parent, component, parameters) {
this.parent = parent;
this.component = component;
this.parameters = parameters;
this.disposed = false;
this.createPortal();
}
createPortal() {
const initialProps = Object.assign({}, this.parameters);
let setStateLocal;
// Mount Solid component into parent element
this.disposeRoot = render(() => {
const [state, setState] = createStore(initialProps);
setStateLocal = setState;
return createComponent(this.component, state);
}, this.parent);
this.setState = (props) => {
setStateLocal((prev) => Object.assign({}, prev, props));
};
}
update(props) {
if (this.disposed) {
throw new Error('invalid operation: resource is already disposed');
}
this.setState(props);
}
dispose() {
this.disposeRoot();
this.disposed = true;
}
}