DEV Community

Cover image for React Design Patterns~Layout Componets / Lists~
Ogasawara Kakeru
Ogasawara Kakeru

Posted on

React Design Patterns~Layout Componets / Lists~

  • Lists

This pattern is useful for displaying list items flexibly.

・magazines.js

export const magazines = [
  {
    name: "VOGUE",
    pages: 256,
    price: 12.33,
  },
  {
    name: "ID-MAGAZINE",
    pages: 224,
    price: 13.33,
  },
  {
    name: "ELLE",
    pages: 233,
    price: 11.33,
  },
];
Enter fullscreen mode Exit fullscreen mode

This object is the magazine items to be displayed on the screen.

・LargeListItems.jsx

import React from "react";

export const LargeMagazineListItems = ({ magazine }) => {
  const { name, price, pages } = magazine;
  return (
    <>
      <h2>{name}</h2>
      <p>{price}</p>
      <p># of pages: {pages}</p>
    </>
  );
};
Enter fullscreen mode Exit fullscreen mode

This component displays name, price and pages receiving magazine items as props, which is called magazine.

・SmallListItems.jsx

import React from "react";

export const SmallMagazineListItems = ({ magazine }) => {
  const { name, price } = magazine;
  return (
    <h2>
      {name} / {price}
    </h2>
  );
};
Enter fullscreen mode Exit fullscreen mode

This component displays name and price receiving magazine items as props, which is called magazine.

・regular.jsx

import React from "react";

export const RegularList = ({ items, sourceName, ItemComponent }) => {
  return (
    <>
      {items.map((item, i) => (
        <ItemComponent key={i} {...{ [sourceName]: item }} />
      ))}
    </>
  );
};
Enter fullscreen mode Exit fullscreen mode

・This component displays list items flexibly, taking items, sourceName, and ItemComponent as props.

・numbered.jsx

import React from "react";

export const NumberedList = ({ items, sourceName, ItemComponent }) => {
  return (
    <>
      {items.map((item, i) => (
        <>
          <h3>{i + 1}</h3>
          <ItemComponent key={i} {...{ [sourceName]: item }} />
        </>
      ))}
    </>
  );
};
Enter fullscreen mode Exit fullscreen mode

・This component displays number and list items flexibly, taking items, sourceName, and ItemComponent as props.

import React from "react";

export const RegularList = ({ items, sourceName, ItemComponent }) => {
  return (
    <>
      {items.map((item, i) => (
        <ItemComponent key={i} {...{ [sourceName]: item }} />
      ))}
    </>
  );
};
Enter fullscreen mode Exit fullscreen mode

・This component displays list items flexibly, taking items, sourceName, and ItemComponent as props..jsx

import React from "react";

export const RegularList = ({ items, sourceName, ItemComponent }) => {
  return (
    <>
      {items.map((item, i) => (
        <ItemComponent key={i} {...{ [sourceName]: item }} />
      ))}
    </>
  );
};
Enter fullscreen mode Exit fullscreen mode

・This component displays list items flexibly, taking items, sourceName, and ItemComponent as props.

・App.js

import { NumberedList } from "./components/lists/numbered";
import { RegularList } from "./components/lists/regular";
import { LargeMagazineListItems } from "./components/magazines/LargeListItems";
import { SmallMagazineListItems } from "./components/magazines/SmallListItems";
import { magazines } from "./data/magazines";

function App() {
  return (
    <>
      <RegularList
        items={magazines}
        sourceName={"magazine"}
        ItemComponent={SmallMagazineListItems}
      />
      <NumberedList
        items={magazines}
        sourceName={"magazine"}
        ItemComponent={LargeMagazineListItems}
      />
    </>
  );
}

export default App;
Enter fullscreen mode Exit fullscreen mode

・This component is composed of the RegularList and NumberedList components, passing items, sourceName, and ItemComponent as props so that I can display list items flexibly.

Image description

Top comments (0)