Skip to content

Why React Wrappers Exist

Web Components (Custom Elements) are great, but they have some friction when used directly in React.

1. Boolean Attributes

In standard HTML, a boolean attribute is set by its presence (<input disabled>). In React, you expect to pass a boolean (<Input disabled={true} />). The wrapper handles this conversion.

2. Event Listeners

React uses synthetic events (onClick). Custom Elements dispatch native CustomEvents. Without Wrapper:

javascript
useEffect(() => {
  ref.current.addEventListener('turbo:click', handler);
  return () => ref.current.removeEventListener('turbo:click', handler);
}, []);

With Wrapper:

javascript
<DynamicButton onTurboClick={handler} />

3. Server Side Rendering Check

React/Next.js will try to render the component on the server. Custom Elements often crash on the server because HTMLElement is not defined. The wrapper encapsulates the logic to ensure they only render on the client.

Next Steps

Released under the MIT License.