Open38

個人開発メモ

とうもろこしとうもろこし

.../dummy?mode=edit のクエリパラメータ mode を取得したい

page.tsx
import { useSearchParams } from "next/navigation";

export const Page = () => {
  const searchParams = useSearchParams();
  const mode = searchParams.get("mode");

  ...
  }
とうもろこしとうもろこし

配列の find 関数で以下のように書いてしまい、検索結果がヒットしない凡ミス。

array.find((e) => {
    e.id === currentId
})

以下のどちらかにしないと動かない。

array.find((e) => e.id === currentId);
array.find((e) => {
    return e.id === currentId
})
とうもろこしとうもろこし

favicon.ico を適用するだけでは、iPhoneの「ホーム画面に追加」時のアイコンには反映されない。

こちらが参考になった。
https://zenn.dev/kazzyfrog/articles/about-favicon-with-nextjs

とうもろこしとうもろこし

iPhoneの「ホームに追加」すると、アイコンの背景が黒になる。
黒線で書いた透過画像を使っていたので、見た目がおかしくなってしまった。

とうもろこしとうもろこし

transition に複数プロパティ指定する方法。

.component {
  transition: width 0.3s, height 0.3s;
}
とうもろこしとうもろこし

CSSの animation で3つのオブジェクトをそれぞれ0〜30%, 30〜60%, 60〜90%のタイミングで入れ替わりで動かしたかったが、きっちり30%ずつ動かない。
例えば、オブジェクト1で0〜30%、オブジェクト2で30〜40%とすれば、実際に動いている時間は等しくなる。

とうもろこしとうもろこし

emotionを導入しようとしたが、Client Componentsでのみ使えるとのことだった。
あとで不都合が生じるかもしれないのでやめた。
Next.jsがサポートを明言している他のCSS-in-JSだと、引数を渡すことができない?

とうもろこしとうもろこし

CSSで transition opacity を使って2つのオブジェクトをスムーズに入れ替えるアニメーションが、iOSのChromeでチラついた。PCのlocalhostでは問題なかった。

とうもろこしとうもろこし

transition に関する解決方法、opacity に関する解決方法を試したがうまくいかなかった。
ライブラリならブラウザごとの問題を解決してくれるかと思い、motion を導入。
実装してみたがやはりちらつく。アニメーションではなく、スクロールに関する問題かも。

とうもろこしとうもろこし

motionuseScrollscrollY を取得してその値でstateをセットしてみた。

  const { scrollY } = useScroll();

  useMotionValueEvent(scrollY, "change", (latest) => {
    if (latest > 157) {
      setShowStickyIcon(true);
    } else {
      setShowStickyIcon(false);
    }
  });
とうもろこしとうもろこし

メインの page.tsx に置いてstickyさせていたコンポーネントを、子コンポーネントとして別ファイルにしたら、stickyが効かなくなった。
スクロールさせながら getBoundingClientRect()top を取得したら変化していないので、子コンポーネント内での位置の変化検知になっていそう。

とうもろこしとうもろこし

firestoreの addDocs で400エラー。
DBのセキュリティルールが初期状態では読み書き禁止になっているため、適切に修正する。

とうもろこしとうもろこし

iOSはテキストフィールドのfont-sizeが16pxより小さいと、テキストフィールドにズームインするようになっている。

とうもろこしとうもろこし

「30回ループ」が構文エラーになり書き換えた。

// エラー
[...Array(30)].map(() => {
...
}

// 効いた
const arr = [...Array(30)].map((_, i) => i);
arr.map(() => {
...
}
とうもろこしとうもろこし

戒めシリーズ

とうもろこしとうもろこし

機能を取り除いた場合も個別にCommitしておく。
あとでその機能を戻したい時にコミットメッセージで追いやすい。

とうもろこしとうもろこし

コンポーネントはComponent、ステートはStateなど変数名の最後に付ける。
色んな変数を使っているとどれが何の性質を持っているかわからなくなってくる。

とうもろこしとうもろこし

Next.js/React開発で基本的に入れているライブラリ(随時更新)

  • dayjs(日付)
  • swr(データフェッチ)
  • motion(アニメーション)
  • zustand(状態管理)
とうもろこしとうもろこし

スクロールバーを非表示にするためのブラウザ別CSS。

.component {
    -ms-overflow-style: none; // IE,Edge
    scrollbar-width: none; // Firefox
}
 
.component::-webkit-scrollbar {
    display:none; // Chrome
}
とうもろこしとうもろこし

数値入力用のテキストフィールドを <input type='number' /> で上下の矢印キーを非表示にして使っていたが、フォーカスを当てると勝手に謎の数字が入力される現象に見舞われた。
type='text' にして、テキスト変化時に数字または小数点以外を削除するように変更した。

const onChangeText = (value: string) => {
    let newVal = value;
    if (inputMode === "decimal") {
      newVal = value.replace(/[^0-9|\.]/g, "");
      if (newVal.length > 6) {
        newVal = newVal.slice(0, 6);
      }
    }
    setText(newVal);
    onChangeValue(newVal);
  };
とうもろこしとうもろこし

PWA設定していない場合、iPhoneのChromeで「ホーム画面に追加」をすると、ホーム画面にアイコンが追加されてタップするとChromeの新規タブが開き該当サイトが表示される。
一方、AndroidのChromeでは「インストール」という項目になっており、実行するとホーム画面にアイコンが追加され、タップすると専用のChromeブラウザが開き、アプリのように表示される。
PWAのような挙動になるためか、以下の点で困った。

  • アイコンタップ時に毎回リロードされるわけではないため、入力フォームの現在時刻がリセットされなかった。
  • Cookieにログイン継続のための情報を期限付きで保持しているが、その期限を無視して勝手に削除される?
とうもろこしとうもろこし

現在時刻の件は、初期状態で「現在時刻」とだけ表示して保存時に現在時刻をセットする仕様に変更した。

とうもろこしとうもろこし

グラフ描画ライブラリ recharts で、 <XAxis /> の初期オプションでは、X軸のデータ点がカテゴリとみなされて均等に配置される。
例えば [1, 2, 2.5] というデータ配列を作った時に、1から2までの距離と、2から2.5までの距離が等しくなる。
数字と認識してもらうには、 <XAxis type='number' /> のオプションをつける。