🐓

Reactのチュートリアルその2

2024/05/28に公開

はじめに

この前、reactのチュートリアルをやってみました。その続きになります。
https://zenn.dev/sikmi_tech/articles/1941ac998af5d4

GitHub Pagesに表示させる

その前に、GitHub Pagesで表示されるようにしてみました。

昔は、ビルドしたファイルをpushして表示してたと思いますが、今は、GitHub Actionsを使うと表示されるようになるそうです。
なので、色々なサイトの見様見真似で下記を書いてみました。
https://github.com/na8esin/react-vite-practice/blob/5286f2b5256e3f71ce5dd9fd8104f72ceb5e9813/.github/workflows/node.js.yml

一見成功しているように見えるんですが、jsとかcssとかのパスが間違ってます。

昔、create-react-appでプロジェクト作ったとき(vite使ってないとき)はpackage.jsonのhomepageで調整した記憶があるので、一応入れてみたんですが、違うようでした。

なので、下記を参考に、
https://ja.vitejs.dev/guide/build.html#public-base-path
こんな感じで修正。
https://github.com/na8esin/react-vite-practice/commit/21d66b926946cf502f77cfbc7a88405a9ace8ff9
動作している様子
https://youtu.be/u724k22Oeig

手順を昇順または降順でソートできるトグルボタンを追加する

GitHub Pagesに表示できたところで、チュートリアルの続きを行います。
https://ja.react.dev/learn/tutorial-tic-tac-toe#wrapping-up

トグルボタンのデザインはこちらを参考にさせていただきました。
https://blog.to-ko-s.com/css-toggle-button/

それで、cssのクラス名を他のコンポーネントと衝突させたくなかったので、CSS Modulesを使います。
https://ja.vitejs.dev/guide/features#css-modules
ファイル名にmoduleをつけて、クラス名をキャメルケースにすればいいようです。
あとちょっと、サイズが大きかったので、全体的に半分の大きさにしてます。

toggle.module.css
.toggleButton {
  display: inline-block;
  position: relative;
  width: 50px;
  height: 25px;
  border-radius: 50px;
  background-color: #dddddd;
  cursor: pointer;
  transition: background-color .4s;
}

.toggleButton:has(:checked) {
  background-color: #4bd865;
}

.toggleButton::after { /* 押せるところの丸の部分 */
  position: absolute;
  top: 0;
  left: 0;
  width: 25px;
  height: 25px;
  border-radius: 50%;
  box-shadow: 0 0 5px rgb(0 0 0 / 20%);
  background-color: #fff;
  content: '';
  transition: left .4s;
}

.toggleButton:has(:checked)::after {
    left: 25px;
}

.toggleButton input {
    display: none;
}
Toggle.tsx
import styles from './toggle.module.css';

export default function Toggle() {
  return (
    <label className={styles.toggleButton}>
      <input type="checkbox"/>
    </label>
  )
}
App.tsx
export default function Game() {
// ...

  return (
    <div className="game">
      <div className="game-board">
      <Board xIsNext={xIsNext} squares={currentSquares} onPlay={handlePlay} />
      </div>
      <div className="game-info">
        <div style={{ paddingInlineStart: '40px' }}>
          <Toggle />
        </div>
        <ol>
          {moves}
        </ol>
      </div>
    </div>
  );
}

それとcssのクラス名が他で使えないことはこんな感じで試してます。

あと↑のpaddingInlineStartの部分ですが、一文字でも違うとエラーが出ます。

ちゃんと定義されてます↓。

世の中すごい人たちがいるもんです。

肝心の昇順または降順する処理はこんな感じで切り出してます。
https://github.com/na8esin/react-vite-practice/blob/729f70a399b5bb51c8c18bbf5289a640ba327916/src/App.tsx#L116-L142
これって、パフォーマンス的に悪かったりするのでしょうか。flutterのhelper method問題みたいな感じ?
ちょっと調べた感じだと特にそんな感じのドキュメントは見当たらなかったです。

ただ、ここを見た感じだと、JSX.Element[]を返すような場合もコンポーネントにしてるので、それに従った方が良さそうです。
https://ja.react.dev/learn/keeping-components-pure#local-mutation-your-components-little-secret

ということで、直してみました。
https://github.com/na8esin/react-vite-practice/blob/e5b9a8828f460954eec8a911dde56bf2304ee700/src/App.tsx#L113-L144

ここで、動作確認してる時に、olの数字も一緒に逆順になるとわかりやすいんじゃないかと思いました。
ということで、reversed={!onOff}の部分だけ追加してます。

<ol reversed={!onOff}>
  <Moves history={history} currentMove={currentMove} jumpTo={jumpTo} onOff={onOff} />
</ol>

そして、こんな感じになりました。
https://youtu.be/euJcirxOnAI
以上です。

しくみのテックブログ

Discussion