If you ever played around with React, you probably found a situation where you'd need to conditionally wrap a component. If it matches some condition, it should be rendered inside a given tag, if not, leave it as is. Here's a small snippet for that:
import { FC, ReactNode, createElement } from 'react'; interface WrapProps { if?: boolean; with: typeof createElement.arguments[0]; wrapperProps: typeof createElement.arguments[1]; children: NonNullable<ReactNode>; } const Wrap: FC<WrapProps> = ({ if: condition, with: wrapper, wrapperProps, children, }) => condition ? createElement(wrapper, wrapperProps, [children]) : <>{children}</>; export default Wrap;
Usage:
const condition = useMemo(() => index % 2 === 0, [index]); <Wrap if={condition} with="a" wrapperProps={{ 'data-testid': 'wrapper' }}> <p>Wrapped text</p> </Wrap>
This component uses React.createElement
because it allows dynamic component creation. It means that, instead of providing a function like (children) => <p>{children}</p>
for Wrap, it is possible to pass a React Component instance or a HTML node name.
Top comments (0)