Blog>
Snippets

Bootstrap Angular Elements in a React Application

Show how to integrate Angular Elements as custom web components in a React application, ensuring that React can control and interact with the inputs and outputs of the Angular Elements.
// Define the Angular element in the Angular application
// The Angular application must be set up to export custom elements
// This example assumes 'my-angular-element' is already defined
const angularElement = document.createElement('my-angular-element');

// Register the custom element in the React application
// This should be done in the top-level file, like index.js
// 'my-angular-element' is the tag name used by the Angular element
if (!customElements.get('my-angular-element')) {
  customElements.define('my-angular-element', angularElement);
}
Registers the 'my-angular-element' custom element, which is exported from an Angular application, within the React application if it's not already defined. This should be done before the React application tries to render the custom element.
import React, { useEffect, useRef } from 'react';

const AngularElementWrapper = ({ data, onEvent }) => {
  const angularElementRef = useRef(null);

  useEffect(() => {
    // Register event listeners if specified
    if (onEvent && angularElementRef.current) {
      angularElementRef.current.addEventListener('customEvent', onEvent);
    }

    // Pass the data down to the Angular element as a property
    if (angularElementRef.current) {
      angularElementRef.current.data = data;
    }

    // Clean up the event listeners on component unmount
    return () => {
      if (onEvent && angularElementRef.current) {
        angularElementRef.current.removeEventListener('customEvent', onEvent);
      }
    };
  }, [data, onEvent]);

  return <my-angular-element ref={angularElementRef}></my-angular-element>;
};

export default AngularElementWrapper;
Defines a React component that wraps the 'my-angular-element'. It uses a ref to interact with the DOM element directly, passing down inputs (data) and setting up listeners for outputs (events).
import React from 'react';
import AngularElementWrapper from './AngularElementWrapper';

function App() {
  const handleEventFromAngularElement = event => {
    console.log('Event received from Angular element:', event);
  };

  const dataForAngularElement = { /* some data */ };

  return (
    <div className="App">
      <h1>React Application</h1>
      <AngularElementWrapper
        data={dataForAngularElement}
        onEvent={handleEventFromAngularElement}
      />
    </div>
  );
}

export default App;
Implementation of a React component 'App' that renders the 'AngularElementWrapper'. It provides a function to handle events emitted by the Angular element and passes data to it as props.