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

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

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

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

Q&A

解決済

1回答

1728閲覧

ReactのECサイトで商品一覧ページから商品詳細ページへのリンクをうまく作りたい。

human9

総合スコア5

React.js

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

0グッド

1クリップ

投稿2021/08/01 05:48

reactでECサイトのポートフォリオを作成しています。
商品一覧ページで商品名をクリックしたら商品詳細ページに飛ぶようにしようと考えています。
以下のように実装したところ商品詳細ページに飛んだ時にエラーが出てしまいます。
コンソールログで確認したところpropsの形で渡したdocがうまく読み込めていないようです。
どのようにすればリンク先にpropsを渡すことができるでしょうか?

react

1import React,{useState} from "react"; 2import {Link} from "react-router-dom"; 3import PageButton from "./PageButton"; 4 5export default function GameInfo(props){ 6 const [count, setCount] = useState(0); 7 return( 8 <div> 9 <ul> 10 <div className="game-container"> 11 {props.gameDoc.slice(count*10, count*10+10).map((doc, index) => 12 <li className="game-image" key={index} style={{marginBottom:"30px", display:"flex"}}> 13 <img src={doc.photo} alt="not image" height="220px" width="330px"/> 14 <div className="game-info" style={{marginLeft:"30px"}}> 15 {/*ここのリンクについて質問*/} 16 <Link to="/Detail" game={doc}><h1>{doc.name}</h1></Link> 17 <p>price: ¥{doc.price}</p> 18 </div> 19 </li>) 20 } 21 </div> 22 </ul> 23 <PageButton gameDoc={props.gameDoc} count={count} setCount={setCount}/> 24 </div> 25 ) 26}

リンク先のページ(Detail)のコンソールログでprops.gameがundefinedとなっているためpropsで渡したdocがうまく読み込めていないと考えております。

Detail

1import React from "react"; 2import {Button} from "@material-ui/core"; 3 4function Detail(props) { 5 console.log(props.game); 6 return ( 7 <div> 8 <img src={props.game.photo} alt="not image" /> 9 <h1>{props.game.name}</h1> 10 <p>{props.game.detail}</p> 11 <p>{props.game.category}</p> 12 <p>{props.game.price}</p> 13 </div> 14 ); 15} 16export default Detail;

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

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

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

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

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

hoshi-takanori

2021/08/01 06:05

Link タグには game={doc} などの余分なものは追加できないので、to={"/Detail/" + doc.id} みたいにする必要があるかと。
human9

2021/08/01 06:45

なるほどです。現在データベースに69個の商品を保存してあるのですが、この場合69個分Detail/doc.idのページを作成する必要があるということですか?
human9

2021/08/01 10:08

ありがとうございます! 試してみてみます。
guest

回答1

0

ベストアンサー

親コンポーネントが質問文に載っていないので断定できかねるのですが、
親から子へのpropsの値を取得してないのでは?

docも親から子へ経由されている変数ならば、子コンポーネントGameinfo内のdocはprops.docになるはずです。

なので、子から孫コンポーネントDetailへ値を渡す際にも未定義のままのdocを受け渡そうとしているのでエラーになっていると思います。

投稿2021/08/02 07:47

FKM

総合スコア3647

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

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

human9

2021/08/02 08:19 編集

回答ありがとうございます。 親のコンポーネントは以下のようになっています。 ```react import React,{useState, useEffect} from "react"; import Container from "./Container"; import "firebase/firestore"; import {db} from "../base"; function Home(props) { var docRef = db.collection("games"); const [game, setGame] = useState([]); let gameArray = []; useEffect(() => { //カテゴリーが指定されていない時の表示 if(props.category == null){ docRef.get().then((querySnapshot) => { querySnapshot.forEach((doc) => { gameArray.push(doc.data()); }); return gameArray }).then((gameArray) => { setGame(gameArray); }).catch((error) => { console.log("Error getting document:", error); }); }; },[]) console.log(game); return ( <div> <GameInfo title={"TOP"} gameDoc={game}/> </div> ); } ``` GameInfo.jsでは親コンポーネントから渡されているのはgameDoc配列だけです。この配列にmapメソッドをかけた時のローカル変数がdocとなっています。 mapメソッド内でdocを使っているので問題ないと思っているのですがどうでしょうか?
FKM

2021/08/02 09:20

確かにそうですね、だとすると親コンポーネントのgameにはきちんと値が入ってきているのでしょうか?
human9

2021/08/03 00:59

親コンポーネントのgameと子コンポーネントのgameDocに値が入ってきていることはコンソールログで確認済みです。 また、以下のように詳細ページへのリンクをコメントアウトしてDetailコンポーネントを直接置いた場合は情報を渡せるので自分のLinkの使い方自体に問題があると考えています。 ``` GameInfo return( <div> <ul> <div className="game-container"> {props.gameDoc.slice(count*10, count*10+10).map((doc, index) => <li className="game-image" key={index} style={{marginBottom:"30px", display:"flex"}}> <img src={doc.photo} alt="not image" height="220px" width="330px"/> <div className="game-info" style={{marginLeft:"30px"}}> {/* <Link exact to="/detail/:docId" game={doc}><h1>{doc.name}</h1></Link> */} <Detail game={doc} /> <p>price: ¥{doc.price}</p> </div> </li>) } </div> </ul> ```
human9

2021/08/03 02:47

かなり参考になりました。任意のパラメータとしてdoc.nameを渡してやればできそうですね。 試してみます!
human9

2021/08/03 06:27

できました!情報提供本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問