カテゴリー
開発環境

nextjsとreact日記10~12

自分用のメモです。

10.配列の要素をランダムに並び替える関数。

//配列の要素をランダムに並び替える関数。arrayには数字が入った配列が入る。戻り値はランダムにした配列。
const shufflesArray = (array: (number | undefined)[]): (number | undefined)[] => {

  //配列のコピー
  const cloneArray = [...array]

  //配列をランダムにシャッフル
  const shuffled = cloneArray.sort(() => 0.5 - Math.random());

  //console.log(shuffled);
  return shuffled;
}

11.配列の要素から指定した要素を抜いて、ランダムに3つの要素を取り出す関数。

//正解1つ、間違い3つのランダムに4つの数字を選ぶ関数。戻り値は配列。
//arrayは配列が入る。countは間違いの個数が入る、3を指定。mは正解が入る。
const RandomSelected2 = (array: number[], count: number, m: number): (number | undefined)[] => {

  //配列のコピー
  const copyArrays = [...array];

  //配列から正解だけを引く
  const newArray = copyArrays.filter(copyArray => copyArray !== m);

  //配列をランダムにシャッフル
  const shuffled = newArray.sort(() => 0.5 - Math.random());

  //配列の先頭から3つ選ぶ
  const randomElements = shuffled.slice(0, count);

  return randomElements;
}

12.Unhandled Runtime Errorの解決方法が分かった。

Error: Text content does not match server-rendered HTML. See more info here: https://nextjs.org/docs/messages/react-hydration-error

Text content did not match. Server: “47” Client: “10”

サーバー側とクライアント側のレンダリングにずれが発生したときに出るエラー。

const Page = () => {

  const h1Title = "九九ゲーム"

  const shinArray = [...Num99s5];

  ShinFiveTables.map((Shin9) => {
    //ランダムな数が入った3つの配列
    const threeArray = RandomSelected2(shinArray, 3, Shin9.answer);

    //ランダムな数が入った3つの配列に正解の数が入り4つの配列となる。
    threeArray.unshift(Shin9.answer);

    //4つの配列をシャッフルする
    const shufflelist = shufflesArray(threeArray); 

    //4つの配列を一つずつコピーする。
    Shin9.reply['rep1'] = shufflelist[0];
    Shin9.reply['rep2'] = shufflelist[1];
    Shin9.reply['rep3'] = shufflelist[2];
    Shin9.reply['rep4'] = shufflelist[3];        
  })

  return (
    <>
    <div className="container m-auto">
      <main className="flex flex-col items-center justify-between p-24">
        <div className='flex-initial w-1600 bg-blue-100'>
          <h1 className="my-4 text-center font-bold text-5xl tracking-tight bg-gradient-to-r from-green-500 via-blue-500 to-pink-500 bg-clip-text text-transparent">{h1Title}</h1>
        </div>
      </main>
      <main className="flex flex-col items-center justify-between p-24">
        <OneQuestionAndAnswer3 ShinFiveTables={ShinFiveTables}/>
      </main>
      <main className="flex flex-col items-center justify-between p-24">
        <p><Link href="/" className="text-2xl font-bold text-red-600">Home</Link></p>
        <p><Link href="/sub1" className="text-2xl font-bold text-red-600">sub1</Link></p>
        <p><Link href="/sub2" className="text-2xl font-bold text-red-600">九九ゲーム</Link></p>
      </main>
    </div>
    </>    
  )
}

export default dynamic(async () => Page, { ssr: false });

export default dynamic(async () => Page, { ssr: false });

https://zenn.dev/sora_kumo/articles/7f8a86c005f850

asyncを入れることによって、エラーが回避されました。よかった。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です