React Children Flattener

1.1.2 · active · verified Sun Apr 19

`react-flatten-children` is a lightweight React utility library designed to resolve challenges associated with React Fragments when processing component children. In React, fragments (`<></>` or `<React.Fragment>`) group multiple children but are treated as single children by their parent, which can disrupt components expecting direct access to all child elements (e.g., `react-router`'s `Switch` component looking for `Route` children). This package offers a single function, `flattenChildren`, which recursively traverses a component's `children` prop, extracts all valid React elements, and returns them as a flat array. This effectively "unwraps" fragments, ensuring all nested children are accessible. The current stable version is 1.1.2, with recent updates primarily adding TypeScript support in v1.1.0. Its primary value lies in simplifying child manipulation for library authors and application developers alike, preventing common issues where fragment usage can lead to unexpected component behavior or errors during child introspection. It helps maintain compatibility with user expectations of flexible fragment usage within component APIs.

Common errors

Warnings

Install

Imports

Quickstart

This example demonstrates how to use `flattenChildren` to make a `react-router` Switch component compatible with React Fragments, allowing routes to be conditionally grouped within fragments.

import React from 'react';
import { Switch as BaseSwitch, Route, Redirect } from 'react-router';
import flattenChildren from 'react-flatten-children';

// Imagine these are your page components
const PublicHome = () => <div>Public Home</div>;
const PrivateHome = () => <div>Private Home</div>;
const Account = () => <div>Account Page</div>;
const Login = () => <div>Login Page</div>;
const About = () => <div>About Page</div>;

// Create a fragment-ready Switch component that can handle nested fragments
const Switch = ({ children }) => (
  <BaseSwitch>{flattenChildren(children)}</BaseSwitch>
);

const Routes = ({ isLoggedIn }) => (
  <Switch>
    {isLoggedIn ? (
      <>
        <Route exact path="/" component={PrivateHome} />
        <Route path="/account" component={Account} />
      </>
    ) : (
      <>
        <Route exact path="/" component={PublicHome} />
        <Route path="/login" component={Login} />
      </>
    )}
    <Route path="/about" component={About} />
    <Redirect to="/" />
  </Switch>
);

export default Routes;

view raw JSON →