react-well-platesを使ってみた

前回ちらっと紹介したReactコンポーネントライブラリreact-well-platesを使ってみました。公式のStorybookが参考になりました。

下準備

まず、create-react-appによるアプリの骨組み作成とnpmによるライブラリのインストールを行います。

npx create-react-app my-wellplate-app
cd my-wellplate-app
npm install react-well-plates

メインコードの作成

my-wellplate-app/src/App.jsの内容を編集し、以下のような内容で保存します。propsrowscolumnsは必須項目のようです。

import logo from './logo.svg';
import './App.css';
import { WellPlate } from 'react-well-plates';

function App() {
  const props = {
    rows: 8,
    columns: 12
  };
  return (
    <WellPlate {...props} />
  );
}

export default App;

アプリの起動

以下のコマンドでアプリを起動します。自動でWebブラウザが立ち上がり基本的なwellplateの図が表示されます。

npm start

様々な設定

上記で示したWellPlateコンポーネントにはpropsを編集することで様々な設定ができます。

// 設定例
const props = {
    rows: 8, // N行のwellplateを表示 96なら8、384なら16といった感じ
    columns: 12, // M行のwellplateを表示 96なら12、384なら24といった感じ
    wellSize: 30, // 1wellのサイズデフォルトは多分40(px)
    wellStyle: () => ({
        fontSize: 'x-small',
    }),  // wellのstyle情報を返す関数を設定
    renderText: ({index, label}) => {
        return (
            <div>
                <div>{index}</div>
                <div>{label}</div>
            </div>
        );
    },  // wellの中に表示する内容を返す関数を設定
    displayAsGrid: true  // グリッド表示(格子状表示)
};

Well選択可能なwellplate

クリックによるwellの選択を可能にするためには<WllPlate />の代わりに<MultiWellPicker />を使います。また、ReactのuseState関数を使用します。

設定必須の項目として、valueonChangeが増えます。

import logo from './logo.svg';
import './App.css';
import { useState } from 'react';
import { MultiWellPicker } from 'react-well-plates';

function App() {
    const initialValue = [3, 4, 5];  // 最初に選択されているwellのインデックス
    const [value, setValue] = useState(initialValue);
    const props = {
        rows: 8,
        columns: 2,
        value: value,
        onChange: setValue,
        disabled: [0, 1, 2],  // 選択できないwellを指定できる(任意)
    };
    const selected_list = value.map((v) => <li>{v}</li>); // 選択したwellのインデックスをリスト表示するための処理
    return (
        <div>
            <MultiWellPicker {...props} />
            <ul>{selected_list}</ul>
        </div>
    );
}

export default App;