I want to dynamically select a react component from a object with a key
import React, {useState, useEffect} from 'react'
import ComponentA from '@components/ComponentA';
import ComponentB from '@components/ComponentB';
const DynamicComponent: React.FC = ({key}) => {
const [Component, setComponent] = useState<any>();
const COMPONENTS = {
COMPONENT_A: ComponentA,
COMPONENT_B: ComponentB,
};
useEffect(() => {
if (key) setComponent(COMPONENTS[key])
}, [key]);
return Component ? React.createElement(Component) : null;
};
With this i get a type error on COMPONENTS[key]
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ COMPONENT_A: FC<{}>; }'.
No index signature with a parameter of type 'string' was found on type '{ COMPONENT_A: FC<{}>; }'.
How do i type this correctly?
CodePudding user response:
You need define PropTypes for your component, also type of Key.
import React, {useState, useEffect} from 'react'
import ComponentA from '@components/ComponentA';
import ComponentB from '@components/ComponentB';
type Key = "COMPONENT_A" | "COMPONENT_B"
type Props = { key: Key }
const DynamicComponent: React.FC<Props> = ({key}) => {
const [Component, setComponent] = useState<any>();
const COMPONENTS = {
COMPONENT_A: ComponentA,
COMPONENT_B: ComponentB,
};
useEffect(() => {
if (key) setComponent(COMPONENTS[key])
}, [key]);
return Component ? React.createElement(Component) : null;
};
CodePudding user response:
You're missing default value for useState
You can use null as default value:
useState(null)
Like this:
const [Component, setComponent] = useState<any>(null);