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

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

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

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

TypeScript

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

React.js

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

Q&A

解決済

1回答

4578閲覧

Reactで外部APIを叩いて検索結果を表示したい

maskmelon

総合スコア63

Next.js

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

TypeScript

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

React.js

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

0グッド

0クリップ

投稿2020/10/03 09:29

編集2020/10/03 09:32

Reactの勉強で簡易なアプリを作っています。フレームワークはNext.jsを使用しています。
入力されたキーワードをクエリとしてGoogle Book APIを叩き、その検索結果をSearchResultsのpropsに渡したいです。
キーワードをuseStateで管理し、submitボタンを押した際にデータを取得してコンソールに表示させるところまでできたのですが、取得したデータをどのようにしてSearchResultsコンポーネントに渡せばよいのか分からず詰まってしまいました。

何かアドバイスを頂けないでしょうか?

tsx

1import { useState } from 'react'; 2import axios from 'axios'; 3import Layout from '../../components/Layout'; 4 5const getBooks = async (keywords: string) => { 6 const url = `https://www.googleapis.com/books/v1/volumes?q=${keywords}`; 7 const { 8 data: { items }, 9 } = await axios.get(url); 10 console.log(items) 11 return items; 12}; 13 14const BookSearch = () => { 15 const [keywords, setKeywords] = useState(''); 16 17 return ( 18 <Layout title="Book Search | Next.js + TypeScript Example"> 19 <form 20 onSubmit={e => { 21 e.preventDefault(); 22 getBooks(keywords); 23 }} 24 > 25 <input 26 type="text" 27 name="searchInput" 28 onChange={e => setKeywords(e.target.value)} 29 /> 30 <button type="submit">Search</button> 31 </form> 32 {/* <SearchResults /> getBooksで取得したデータをpropsで渡したい */} 33 </Layout> 34 ); 35}; 36 37export default BookSearch; 38

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは

以下、コード修正、追加の一例を挙げます。(※APIが失敗したときの対応など、細部は詰めていません)

APIの結果から取得したい書籍データの属性を持つ Book type を定義しておきます。ここでは、とりあえず id, タイトル、出版社、出版日を持つ type としました。

typescript

1type Book = { 2 id: string 3 volumeInfo: { 4 title: string 5 publisher: string 6 publishedDate: string 7 } 8} 9 10export default Book;

上記のソースファイル名を src/models/Book.ts として、BookSearch を以下のように修正します。

diff

1+ import Book from "../../models/Book";

diff

1const BookSearch = () => { 2 const [keywords, setKeywords] = useState(''); 3+ const [books, setBooks] = useState<Book[]>([]); 4 5 return ( 6 <Layout title="Book Search | Next.js + TypeScript Example"> 7 <form 8- onSubmit={e => { 9+ onSubmit={async (e) => { 10 e.preventDefault(); 11- getBooks(keywords); 12+ const books: Book[] = await getBooks(keywords); 13+ setBooks(books); 14 }} 15 > 16 <input 17 type="text" 18 name="searchInput" 19 onChange={e => setKeywords(e.target.value)} 20 /> 21 <button type="submit">Search</button> 22 </form> 23- {/* <SearchResults /> getBooksで取得したデータをpropsで渡したい */} 24+ <SearchResults books={books} /> 25 </Layout> 26 ); 27};

以下は上記の修正版を動作確認するためのサンプルです。SearchResults は動作確認のための簡単なもので、<table>で作りました。

参考になれば幸いです。

投稿2020/10/03 20:42

編集2020/10/04 16:26
jun68ykt

総合スコア9058

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

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

maskmelon

2020/10/05 09:34

うまくできました!Stateを追加すればよかったんですね。 わかりやすい回答をありがとうございました。
jun68ykt

2020/10/05 11:42

どういたしまして > うまくできました! とのことでよかったです????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問