もふもふ技術部

IT技術系mofmofメディア

【Rails7】特定のviewsで部分的にReactを使う

「ここのページだけReact使いたいんだよな〜」とか「ページのここの部分にReact入れ込みたいんだよな〜」ということはありませんか?
今回はそんなあなたにReactを部分的に使用する方法を紹介します。

こちらの記事を応用していきます。↓ www.mof-mof.co.jp

下準備
Reactの導入方法はこちらの記事をご参照ください↓↓
www.mof-mof.co.jp

手順

1. package.json に記載されているビルドスクリプトのビルド対象に app/javascript/*.* が入っていることを確認する。

入っていない場合は以下を参考に書き換えてみてください。

"build:js": "esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds"
2. Reactで実装と、renderの設定をする

app/javascripts/mofmof.tsx

import React from 'react';
import { createRoot } from 'react-dom/client';

export const Mofmof = () => {
  return (
    <>
      <div>mofmof</div>
    </>
  );
};

const container = document.getElementById('mofmof');
if (container) {
  const root = createRoot(container);

  document.addEventListener('DOMContentLoaded', () => {
    root.render(<Mofmof />);
  });
}
3. viewsファイルのReactを使いたい箇所に以下を追記する
<%= javascript_include_tag "mofmof", "data-turbo-track": "reload", type: "module" %>

色んなページでReactを使いたい場合は、renderの設定を別ファイルに分けて共通化するのがよいと思います。

終わり

この方法だとReact側でsessionを管理しなくても、Rails側で使用しているsession(ログイン情報など)を利用できます。
そのため、ReactからRailsのAPIを叩いたときにログインユーザーが閲覧できるデータだけ取得する時などに便利かと思います。

また、要件によっては工数を削減することにもつながると思うので、個人開発するときには重宝するかもしれません。

(ちょこっと動的にしたい!というときなんかは、ReactではなくHotwireを使うのがRails7風だと思いました。)