The useWidget
hook is used to create React wrappers for normal (non-React) deck.gl widgets, or to create custom widgets with UI rendered by React.
// React wrapper usage
import DeckGL, {useWidget} from '@deck.gl/react';
import {CompassWidget as UniversalCompassWidget, type CompassWidgetProps} from '@deck.gl/react';
const CompassWidget = (props: CompassWidgetProps) => {
const widget = useWidget(UniversalCompassWidget, props);
return null;
}
<DeckGL>
<CompassWidget/>
</DeckGL>
For a custom widget, React can be used to implement the UI itself. A widget class is used to hook into deck.gl apis, and a React portal
is utilized to render the widget UI along-side other widgets.
import React, {useMemo} from 'react';
import type {Widget} from '@deck.gl/core';
import DeckGL, {useWidget} from '@deck.gl/react';
import {createPortal} from 'react-dom';
class MyWidget implements Widget {
constructor(props) {
this.props = { ...props };
}
onAdd() {
return this.props.element; // HTMLDivElement
}
}
const MyReactWidget = (props) => {
const element = useMemo(() => document.createElement('div'), []);
const widget = useWidget(MyWidget, {...props, element});
return createPortal(
<div>Hello World</div>,
element
);
};
<DeckGL>
<MyReactWidget/>
</DeckGL>
useWidget<T extends Widget, PropsT extends {}>(
WidgetClass: {new (props: PropsT): T},
props: PropsT
): T
The hook creates an Widget
instance, adds it to deck.gl, and removes it upon unmount.
Parameters:
WidgetClass
:{new (props: PropsT): T}
- called to create an instance of the control.props
:PropsT
- props passed into the widget constructor on creation andwidget.setProps
on render.
Returns:
Widget
- the widget instance of WidgetClass
.