[React+Tailwind] Flowbite で ListGroup を表示してみる | 心を無にして始める React

準備

Flowbite が使えるプロジェクトを準備します。

ListGroup コンポーネントをつくる

./src/components 配下に ListGroup.js を作ります。

import React, { ComponentProps, forwardRef } from 'react';
import {
  ListGroup as FlowbiteListGroup,
} from 'flowbite-react';
import { LegacyRef } from 'react';

const ListGroup = forwardRef((
  {
    children,
    ...otherProps
  },
  ref,
) => {
  return (
    <FlowbiteListGroup
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteListGroup>
  );
});

const ListGroupItem = forwardRef((
  {
    active = false,
    children,
    disabled = false,
    href,
    icon,
    onClick,
    ...otherProps
  },
  ref,
) => {
  return (
    <FlowbiteListGroup.Item
      active={active}
      disabled={disabled}
      href={href}
      icon={icon}
      onClick={onClick}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteListGroup.Item>
  );
});

export default Object.assign(ListGroup, {
  Item: ListGroupItem,
});

ListGroup コンポーネントをつかう

いつものように App.js を編集していきます。

import { ArrowDownTrayIcon, Cog8ToothIcon, InboxIcon, UserCircleIcon } from '@heroicons/react/24/solid';

import ListGroup from './components/ListGroup';
import './App.css';

function App() {
  return (
    <div className="dark">

      <div className="min-h-screen p-8 gap-4 flex flex-col justify-center items-center dark:!bg-gray-900">
        <div className="w-48">
          <ListGroup>
            <ListGroup.Item
              active={true}
              href="/list-group"
            >
              Profile
            </ListGroup.Item>
            <ListGroup.Item href="/list-group">
              Settings
            </ListGroup.Item>
            <ListGroup.Item href="/list-group">
              Messages
            </ListGroup.Item>
            <ListGroup.Item href="/list-group">
              Download
            </ListGroup.Item>
          </ListGroup>
        </div>

        <div className="w-48">
          <ListGroup>
            <ListGroup.Item
              active={true}
              onClick={function onClick() { return alert("Profile clicked!") }}
            >
              Profile
            </ListGroup.Item>
            <ListGroup.Item>
              Settings
            </ListGroup.Item>
            <ListGroup.Item>
              Messages
            </ListGroup.Item>
            <ListGroup.Item>
              Download
            </ListGroup.Item>
          </ListGroup>
        </div>

        <div className="w-48">
          <ListGroup>
            <ListGroup.Item
              active={true}
              icon={UserCircleIcon}
            >
              Profile
            </ListGroup.Item>
            <ListGroup.Item icon={Cog8ToothIcon}>
              Settings
            </ListGroup.Item>
            <ListGroup.Item icon={InboxIcon}>
              Messages
            </ListGroup.Item>
            <ListGroup.Item icon={ArrowDownTrayIcon}>
              Download
            </ListGroup.Item>
          </ListGroup>
        </div>
      </div>
    </div>
  );
}

export default App;

結果

はい、できました。