Overview
I'm refactoring some older code that has some class based components and I need some clarification on the performance of PureComponent
.
Issue
Previously, the translation hook was at the top level and passed to ALL components, but I refactored those already to call the hook at the component level. There's one remaining component Terms
that the other developers want to leave as a pure component, which would mean I couldn't call the hook on a class based pure component and would have to pass as a prop.
I have two options of passing a translation/localization variable: as prop or hook on child component. What would be the best option in terms of performance renders?
- Option #1: Hook on parent component and pass prop to
PureComponent
- Option #2: Hook on child component and use
FunctionalComponent
OPTION #1 (Top Level + Pass prop to Pure component)
ParentComponent.tsx
export const ParentComponent = (sectionType: SectionType): JSX.Element | null => { const { t } = useTranslation(); // TRANSLATION HOOK HERE (TOP LEVEL) switch (sectionType) { case SectionType.Welcome: return <Welcome /> // HAS TRANSLATION HOOK ON COMPONENT case SectionType.Contact: return <Contact /> // HAS TRANSLATION HOOK ON COMPONENT case SectionType.Terms: return <Terms t={t} /> // TRANSLATION IS PASSED AS PROP TO PURE COMPONENT default: return null; }};
ChildComponent.tsx
interface IProps { t: TFunction<"translation">;}export default class Terms extends React.PureComponent<IProps> { render(): JSX.Element { return ( ) }};
OPTION #2 (No prop + Functional component)
ParentComponent.tsx
export const ParentComponent = (sectionType: SectionType): JSX.Element | null => { switch (sectionType) { case SectionType.Welcome: return <Welcome /> // HAS TRANSLATION HOOK ON COMPONENT case SectionType.Contact: return <Contact /> // HAS TRANSLATION HOOK ON COMPONENT case SectionType.Terms: return <Terms /> // HAS TRANSLATION HOOK ON COMPONENT default: return null; }};
ChildComponent.tsx
export const Terms = () => JSX.Element { const { t } = useTranslation(); // TRANSLATION HOOK HERE (TOP LEVEL) return ( )};