質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

712閲覧

Next.jsで画面遷移時に値を渡す方法がわからない

Hinoki

総合スコア2

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

1グッド

0クリップ

投稿2024/01/28 10:38

実現したいこと

Next.js14で画面遷移をする際に、遷移先のページに値を渡したいと考えています。
具体的には、/rule/page.tsxでユーザー数とユーザーの名前をそれぞれselectedNumber,inputValuesに状態として格納しており、/decide/page.tsxでその値を使いたいと考えています。

発生している問題・分からないこと

Next.js12までの環境でしたら、import useRouter from "next/router"を用いて、router.pushにqueryとして渡すことで可能だったのですが、Next.js13以降から、"next/navigation"からのimportに変更になった影響で、usePathname, useSearchParamsを用いて行わないといけない(?)らしいのですが、具体的な方法がわからないです。調べたところ、URLのパラメータを取得するものばかりで、値を渡すのに使っていないようなので、別の方法があるのかなと感じています。

該当のソースコード

TypeScript

1"use client"; 2 3import Link from "next/link"; 4import { useRouter, usePathname, useSearchParams } from "next/navigation"; 5import { ChangeEvent, useState } from "react"; 6 7const rule = () => { 8 const [selectedNumber, setSelectedNumber] = useState(1); 9 const [inputValues, setInputValues] = useState<string[]>( 10 Array.from({ length: 10 }, () => "") 11 ); 12 13 const router = useRouter(); 14 const pathname = usePathname(); 15 const searchParams = useSearchParams(); 16 17 const query = { 18 selectedNumber, 19 inputValues, 20 }; 21 22 const params1 = searchParams.get(query) 23 24 const handleSelectChange = (e: ChangeEvent<HTMLSelectElement>) => { 25 setSelectedNumber(parseInt(e.target.value, 10)); 26 }; 27 28 const handleInputChange = ( 29 e: ChangeEvent<HTMLInputElement>, 30 index: number 31 ) => { 32 const newInputValues = [...inputValues]; 33 newInputValues[index] = e.target.value; 34 setInputValues(newInputValues); 35 }; 36 37 // const handleStartClick = () => { 38 // const query = { myParam: "myValue" }; 39 // const href = { 40 // pathname: "/my-next-page", 41 // query: { ...searchParams, ...query }, 42 // }; 43 // router.push(href); 44 // }; 45 46 return ( 47 <div> 48 <div className="mt-10 ml-10 text-lg">ルール設定</div> 49 <div className="flex flex-col items-center justify-center"> 50 <div className="flex flex-col mt-8"> 51 <p>人数</p> 52 <select 53 name="people" 54 className="w-60 h-9 mt-2" 55 value={selectedNumber} 56 onChange={handleSelectChange} 57 > 58 {Array.from({ length: 10 }, (_, index) => ( 59 <option key={index + 1} value={index + 1}> 60 {index + 1} 61 </option> 62 ))} 63 </select> 64 <p className="mt-8">名前</p> 65 {Array.from({ length: selectedNumber }, (_, index) => ( 66 <input 67 key={index} 68 type="text" 69 className="w-60 h-9 mt-2 border-2 border-black" 70 placeholder={`名前 ${index + 1}`} 71 value={inputValues[index]} 72 onChange={(e) => handleInputChange(e, index)} 73 /> 74 ))} 75 76 {/* <button 77 className="flex items-center justify-center p-4 mt-10 text-white bg-black rounded hover:text-black hover:bg-gray-300 transition-all duration-300" 78 onClick={handleStartClick} 79 > 80 はじめる 81 </button> */} 82 <div> 83 <Link href={{ pathname: "/decide", query: query }}>始める</Link> 84 </div> 85 </div> 86 </div> 87 </div> 88 ); 89}; 90 91export default rule; 92

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

LinkやuseRouterを用いたqueryの渡す方法を調べてみたのですが、URLのパラメータを取得するものばかりで、的確な情報を取得できませんでした。

補足

package.json は以下の通りです。

{
"name": "ito",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint"
},
"dependencies": {
"next": "14.1.0",
"react": "^18",
"react-dom": "^18"
},
"devDependencies": {
"@types/node": "^20",
"@types/react": "^18",
"@types/react-dom": "^18",
"autoprefixer": "^10.4.17",
"eslint": "^8",
"eslint-config-next": "14.1.0",
"postcss": "^8.4.33",
"tailwindcss": "^3.4.1",
"typescript": "^5"
}
}

honey32👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Next.js の App Router では、Pages Router と大きく変わって、独自の query を使う機会がぐっと減って多くの場合で JS の標準機能である URLSearchParams を使うことになります。

https://developer.mozilla.org/ja/docs/Web/API/URLSearchParams

移動するとき

URLSearchParams を使って普通に(つまりNext.js も React も関係なく、標準のJSの機能を使って)クエリパラメータをの文字列を生成して、繋げたパスを使って移動します。

ts

1 const handleStartClick = () => { 2 const params = new URLSearchParams(); 3 newInputValues.foreach(v => { 4 params.append("v", v); 5 }); 6 const href = `/decide?${params}`; // toString() は省略可能 7 router.push(href); 8 };

読みとるとき

普通に URLSearchParams のメソッド(ここでは getAll) を使って値を取って来ましょう。

useState(initial) に渡した initial の値は、再レンダリングのときには無視されるので、その名の通り初期値を入れられます。

useState の初期値について: https://ja.react.dev/reference/react/useState#parameters

ts

1"use client"; 2 3import { useSearchParams } from "next/navigation"; 4import { useState } from "react"; 5 6export default function Page() { 7 const params = useSearchParams(); 8 const [inputValues, setInputValues] = useState(params.getAll("v")); 9 10 return ( 11 <div> 12 {inputValues.map((v, index) => ( 13 <input 14 key={index} 15 value={v} 16 onChange={(e) => { 17 setInputValues((prev) => { 18 const nextValue = [...prev]; 19 nextValue[index] = e.target.value; 20 return nextValue; 21 }); 22 }} 23 /> 24 ))} 25 </div> 26 ); 27} 28

投稿2024/02/01 15:37

編集2024/02/01 15:38
honey32

総合スコア169

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hinoki

2024/02/01 20:17

無事、解決しました! React,Next.jsのものに囚われずに考えるべきでした… ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問