In the world of React development, the need often arises to enforce access restrictions on various app modules. Let's delve into an approach leveraging Higher-Order Components and Function Composition to tackle this challenge effectively.
Consider the scenario where we aim to ascertain if a user is logged in before rendering certain components. We initially might resort to a straightforward implementation:
function Account() { const sessionContext = useSessionContext(); if (!sessionContext.isAuthenticated) { return <RedirectTo href={PATH_LOGIN} />; } return ( <SomeAccountData /> ); };
However, such an approach presents drawbacks:
- The necessity to import useSessionContext within the Account component, entangling business logic with presentation.
- Repetition of authentication logic across multiple modules leads to code duplication and maintenance challenges.
Higher-Order Components
To solve these issues, we can use Higher-Order Components. Let's craft a function withAuthenticatedUser to encapsulate authentication logic:
function withAuthenticatedUser<T>(WrappedComponent: React.ComponentType<T>) { function WithAuthenticatedUser(props: React.PropsWithChildren<any>) { const sessionContext = useSessionContext(); if (!sessionContext.isAuthenticated) { return <RedirectTo href={PATH_LOGIN} />; } return <WrappedComponent {...props} />; } return WithAuthenticatedUser; } // Apply the HOC to our Account component const WrappedAccount = withAuthenticatedUser(Account);
This cleaner approach enables seamless reuse of the authentication wrapper across various components.
Function Composition for combining a lot of HOCs.
Function Composition further enhances our code organization by consolidating multiple HOCs into a single entity. Let's explore this concept.
By leveraging Function Composition, we efficiently combine various HOCs to create a cohesive single HOC wrapper around our components.
export const compose = (...funcs) => (Component) => funcs.reduce((wrappedComponent, hoc) => hoc(wrappedComponent), Component); // Combine multiple wrappers using function composition const Account = compose( withAuthenticatedUser, withFeatureFlag, withLogger, )(function Account() { return ( <SomeAccountData /> ); });
In summary, when faced with the need for consistent actions across multiple components, consider harnessing Higher-Order Components and Function Composition as powerful tools for enhancing code maintainability and scalability in your React applications.
Top comments (0)