To render React components dynamically without relying directly on JSX, you can utilize React’s createElement API. Your approach to maintaining a mapping (popupContent) of component names to components is a good start. Here’s how you can adjust your Popup component to work properly:
Sample Code:-
import React, { Component } from 'react';
import Login from '../Login/login.js';
import Logout from '../Logout/logout.js';
const popupContent = {
Login: Login,
Logout: Logout,
};
class Popup extends Component {
constructor(props) {
super(props);
this.state = {
componentName: null, // To hold the name of the component to render
};
}
componentDidUpdate(prevProps, prevState) {
const nameOfComponent = "Login"; // Example: This would come from Redux in your case
if (prevState.componentName !== nameOfComponent) {
this.setBodyPopup(nameOfComponent);
}
}
setBodyPopup(nameOfComponent) {
// Update state with the component name
this.setState({ componentName: nameOfComponent });
}
render() {
const { componentName } = this.state;
// Fetch the component class from popupContent using the componentName
const ComponentToRender = popupContent[componentName];
return (
<div>
{ComponentToRender
? React.createElement(ComponentToRender)
: <p>No component to display</p>}
</div>
);
}
}
export default Popup;
If you’re using Redux, you could achieve a cleaner implementation using a functional component and the useSelector hook:
import React from 'react';
import { useSelector } from 'react-redux';
import Login from '../Login/login.js';
import Logout from '../Logout/logout.js';
const popupContent = {
Login: Login,
Logout: Logout,
};
const Popup = () => {
const componentName = useSelector((state) => state.popup.componentName); // Redux state
const ComponentToRender = popupContent[componentName];
return (
{ComponentToRender
?
: No component to display
}
);
};
export default Popup;
Work with our skilled React developers to accelerate your project and boost its performance.
Hire Reactjs Developers