🌟

yamada-ui/chartsをリリースした

2024/04/15に公開

はじめに

3月のyamada-ui v1.3.0のリリースでyamada-ui/chartsが追加されました。
よければ使ってください。

https://yamada-ui.com/ja/components/feedback

使い方

storybookに一通りサンプルを実装しています。

https://yamada-ui.github.io/yamada-ui/?path=/story/components-feedback-areachart--basic

dataにはデータのオブジェクトを投入し、seriesにそのデータの色などのパラメーターを指定してあげます。
dataKeyは今回はname: `Page ${index}`,としているので、nameを入れます。
この3つのpropsが必須です。ほかのチャートも今のところは共通しています。

  • data
  • series
  • dataKey

メモ化できる場合はuseMemoで囲ってあげましょう。

https://github.com/yamada-ui/yamada-ui/blob/0a8180586aed2cd003f9d53718243ae0dd9e34fb/stories/components/feedback/area-chart.stories.tsx#L39-L65

カスタマイズする

以下に記載のPropを入れるとカスタマイズができます。

https://yamada-ui.com/ja/components/feedback/area-chart/props

xAxisPropsyAxisProps,areaPropsなどのPropsはさらにカスタマイズしたい場合に利用できます。

グラフごとにカスタマイズする

複数表示するグラフの一つだけ表示をカスタマイズしたい場合は以下のようにします。

https://github.com/yamada-ui/yamada-ui/blob/0a8180586aed2cd003f9d53718243ae0dd9e34fb/stories/components/feedback/area-chart.stories.tsx#L797-L808

構成

実装した内容を忘れないように、自分用に記録します。
https://github.com/yamada-ui/yamada-ui/tree/main/packages/components/charts/src

前提

yamada-ui/chartsはrechartsを使って実装されています。
rechartsを簡単に利用できるようにして、かつyamada-uiのスタイルシステムを利用できるようにしたものが、yamada-ui/chartsです。

要素

charts/srcの中は以下のファイルで分けてます。

xxx-chart.tsx

各チャートのコンポーネント。
AreaChartLineChartなどがここに入っており、最終的にrechartsを使って表示しているのがここになります。

https://github.com/yamada-ui/yamada-ui/blob/0a8180586aed2cd003f9d53718243ae0dd9e34fb/packages/components/charts/src/area-chart.tsx#L209-L273

use-xxx.ts

カスタムフックでロジックをまとめています。
rechartsを利用しているので、ユーザーが入力してきたPropsをいろいろ計算して、最終的にrechartの要素のPropsに入れる必要があります。
例えば、以下のgetAreaChartPropsという関数はuseAreaChartから持ってきていますが、この関数でReChartsAreaChartに入れれるPropsに変換してあげてます。

https://github.com/yamada-ui/yamada-ui/blob/0a8180586aed2cd003f9d53718243ae0dd9e34fb/packages/components/charts/src/area-chart.tsx#L221-L223

chart.types.ts

yamada-ui/chartsを作るにあたり必要だった型の定義をまとめています。

rechart-properties.ts

rechartのコンポーネントのPropのリストをまとめています。
yamada-uiのPropsと一緒に混ざって入ってくる場合があるため、それを分離するために必要になります。

chart-utils.ts

便利な関数の置き場所。

chart-legend.tsx, chart-tooltip.tsx

デフォルトのtooltipやlegendを実装してます。

処理の流れ

yamada-ui/chartsはrechartsのカスタマイズもできつつ、yamada-uiのスタイルシステムを利用してカスタマイズもできます。
例えばstorybookのcustomAxisではtickMarginorientationなどrechartのPropsも受け入れつつ、colorはyamada-uiの指定の仕方ができます。

https://github.com/yamada-ui/yamada-ui/blob/0a8180586aed2cd003f9d53718243ae0dd9e34fb/stories/components/feedback/area-chart.stories.tsx#L766-L781

混ざって入ってきたPropsは一度分離する必要があります。
分離する処理は何度も実施するのでchart-utils.tsgetComponentPropsにまとめています。
以下が返ってきてます。

  • chartProps: 分離したrechartのProps
  • areaChartClassName: yamada-uiのPropsを当てれるclassName

https://github.com/yamada-ui/yamada-ui/blob/0a8180586aed2cd003f9d53718243ae0dd9e34fb/packages/components/charts/src/use-area-chart.ts#L203-L210

補足

styles.xxxはここのthemeをとってきています。
styles.areaarea:{}の中身が返されます。今回は空です。

https://github.com/yamada-ui/yamada-ui/blob/0a8180586aed2cd003f9d53718243ae0dd9e34fb/packages/theme/src/components/area-chart.ts#L4-L8

LineChartのthemeを引っ張ってきているので、実際はここ。
サイト全体のスタイルを変更するような場合に、カスタマイズすると便利。

https://github.com/yamada-ui/yamada-ui/blob/0a8180586aed2cd003f9d53718243ae0dd9e34fb/packages/theme/src/components/line-chart.ts

getComponentPropsが行っているのは、以下です。

  1. 混ざって入ってきたyamada-uiのPropsとrechartのPropsを分離する
  2. 分離したyamada-uiのPropsのスタイルを当てれるclassNameに変換する
  3. rechartのPropsとclassNameを返してくる

rechartのPropsはそのままrechartのコンポーネントに渡せますが、yamada-uiのPropsはそのままではrechartのコンポーネントに渡すことができないので、classNameでスタイルを当てています。

https://github.com/yamada-ui/yamada-ui/blob/0a8180586aed2cd003f9d53718243ae0dd9e34fb/packages/components/charts/src/chart-utils.ts#L15-L29

計算した値をもとに、getxxxPropsを実装します。
戻り値はrechartのコンポーネントにそのまま入れれる型にする必要があります。

https://github.com/yamada-ui/yamada-ui/blob/0a8180586aed2cd003f9d53718243ae0dd9e34fb/packages/components/charts/src/use-area-chart.ts#L383-L399

getxxxPropsをrechartのコンポーネントに入れて完成!

https://github.com/yamada-ui/yamada-ui/blob/0a8180586aed2cd003f9d53718243ae0dd9e34fb/packages/components/charts/src/area-chart.tsx#L221-L223

rechartsのバグ修正

yamada-uiのスタイルをclassNameで当てる必要がありますが、rechart側のバグにより、当てれない要素が結構ありました。
そのため、rechart側の修正も実施しました。
https://github.com/recharts/recharts/issues/4378
https://github.com/recharts/recharts/issues/4333
https://github.com/recharts/recharts/issues/4304
https://github.com/recharts/recharts/issues/4290

まとめ

バグとか、要望とかあれば、ぜひissueあげてください!

https://github.com/yamada-ui/yamada-ui/issues/new/choose

Discussion