.. _react:
React
-----
Many JupyterLab APIs require `Phosphor `__
`Widgets `__
which have some additional features over native DOM elements, including:
- Resize events that propagate down the Widget hierarchy.
- Lifecycle events (``onBeforeDetach``, ``onAfterAttach``, etc.).
- Both CSS-based and absolutely positioned layouts.
We support wrapping React components to turn them into Phosphor
widgets using the ``ReactWidget`` class from ``@jupyterlab/apputils``:
.. literalinclude:: virtualdom.create.tsx
:force:
Here we use the ``create`` static method to transform a React element
into a Phosphor widget. Whenever the widget is mounted, the React
element will be rendered on the page.
If you need to handle other life cycle events on the Phosphor widget
or add other methods to it, you can subbclass ``ReactWidget`` and
override the ``render`` method to return a React element:
.. literalinclude:: virtualdom.reactwidget.tsx
:force:
We use Phosphor `Signals `__ to represent
data that changes over time in JupyterLab.
To have your React element change in response to a signal event, use the ``UseSignal`` component,
which implements the `"render props" `__.
The `running component `__
and the ``createSearchOverlay`` function in the `search overlay `__
use both of these features and serve as a good reference for best practices.
We follow the `React documentation `__ and
`"React & Redux in TypeScript - Static Typing Guide" `__
for best practices on using React in TypeScript.