Dynamic React Components Rendering - salimakhtar92/ReactJs GitHub Wiki

let suppose we have a json data that includes the components information like name and props etc.

const jsonData = [
  {'id': '1', 'componentName': 'home', 'componentProps': {'description': 'home component'}},
  {'id': '2', 'componentName': 'footer', 'componentProps': {'description': 'footer component'}}, 
  {'id': '3', 'componentName': 'header', 'componentProps': {'description': 'header component'}},
]

Lets pass this jsonData to the DynamicComponent like <DynamicComponent data={jsonData} />

See the App.js file

import React from 'react';
import DynamicComponent from './DynamicComponent';

const jsonData = [
  {'id': '1', 'componentName': 'home', 'componentProps': {'description': 'home component'}},
  {'id': '2', 'componentName': 'footer', 'componentProps': {'description': 'footer component'}}, 
  {'id': '3', 'componentName': 'header', 'componentProps': {'description': 'header component'}},
]

export default function App() {
  return (
       <DynamicComponent data={jsonData} /> 
  );
}

Lets create the DynamicComponent component

Note: Here I am using in operator. The in operator returns true if the specified property is in the specified object or its prototype chain.

Instead of in operator you can use arrow notation componentObject[item.componentName]

import React from 'react';
import Home from './Home';
import Header from './Header';
import Footer from './Footer';

const componentObject = {
    home: Home,
    header: Header,
    footer: Footer
}
export default function DynamicComponent(props) {
    const components =  []
    props.data.forEach((item) => {
        if(item.componentName in componentObject) {
            const MyComponentName = componentObject[item.componentName];
            const MyComponent = <MyComponentName {...item.componentProps} />
            components.push(MyComponent);
        }
    });
    
    return (components);
}

See the definition of Home, Header and Footer components: This is Home.js file

import React from 'react';
export default function Home(props) {

    return (<p>This is {props.description}</p>)
}

This is Header.js file

import React from 'react';
export default function Header(props) {

    return (<p>This is {props.description} </p>)
}

This is Footer.js file

import React from 'react';
export default function Footer(props) {

    return (<p>This is {props.description}</p>)
}

Hope you understand the code. If you have better solutions please tell me here.

Thank you!