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

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

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

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

Q&A

1回答

741閲覧

[React] classコンポーネントをReact Hooksを使ってfunctionコンポーネントに書き換えたい

DaisukeMori

総合スコア226

React.js

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

0グッド

0クリップ

投稿2020/05/01 06:21

編集2020/05/01 07:59

要件(課題)

classコンポーネントで書いたコードを「React Hooks」を導入するために
functionコンポーネントにして改修しているのですが
useEffectsで外部データを展開するところでどうしてもうまくデータが取り出せません。

前提

React
Firestore(Firebaseデータベース)

使いたい技術

React Hooks機能(useState, useEffect)
当然functionコンポーネントで記述

まずこちらが改修前のclassコンポーネント

firestoreからデータをとってきて表示(当然問題なく表示)

js

1import React from 'react'; 2import { Link } from 'react-router-dom'; 3import { db } from '../../Firebase'; 4 5class Index extends React.Component { 6 7 state = { 8 list: [], 9 } 10 11 //データ取得 12 getUsers = async () => { 13 const colRef = db.collection('users') 14 .orderBy('createdAt', 'desc') 15 .limit(10); 16 const dates = await colRef.get(); 17 const docs = dates.docs.map(doc => doc.data()); 18 await this.setState({ 19 list: docs, 20 }); 21 } 22 23 //更新時のcalback 24 onCollectionUpdate = () => { 25 this.getUsers(); 26 } 27 28 componentDidMount = async () => { 29 await this.getUsers(); 30 this.unsubscribe = db.collection('users').onSnapshot(this.onCollectionUpdate); 31 } 32 33 render() { 34 return ( 35 <React.Fragment> 36 <section> 37 <h2>一覧表示</h2> 38 {this.state.list.map(item => ( 39 <div key={item.docId + String(new Date())}> 40 <div>{item.name}</div> 41 <div>{item.email}</div> 42 <div><Link to={`/users/Detail/${item.docId}`}>詳細</Link></div> 43 </div> 44 ))} 45 </section> 46 </React.Fragment> 47 ); 48 } 49} 50 51export default Index;

改修中コード(やったこと)

js

1import React, { useState, useEffect } from 'react'; 2import { Link } from 'react-router-dom'; 3import { db } from '../../Firebase'; 4 5const Index = () => { 6 const [list, setList] = useState([]); 7 8 useEffect(() => { 9 const colRef = db.collection('users') 10 .orderBy('createdAt', 'desc') 11 .limit(10); 12 const dates = colRef.get(); 13 console.log(dates); 14 // コンソールログ結果: ▶︎Promise {<pending>} 15 // ここまではエラーなし 16 17 // [error]mapで出力できるかやってみたらエラーで返される 18 const docs = dates.docs.map(doc => doc.data()); 19 }); 20 21 return ( 22 <React.Fragment> 23 <section> 24 <h2>一覧表示</h2> 25 Viewは一旦取り外し 26 </section> 27 </React.Fragment> 28 ); 29} 30 31export default Index;

エラーコンソール画像

イメージ説明

cf.
一応functionコンポーネントでも
import { useCollectionData } from "react-firebase-hooks/firestore";
これを使ったらシンプルにコード書くことはできました。

js

1import React from 'react'; 2import { Link } from 'react-router-dom'; 3import { db } from '../../Firebase'; 4import { useCollectionData } from "react-firebase-hooks/firestore"; 5 6// functionコンポーネント 7const Index = () => { 8 const [ list, loading, error ] = useCollectionData( 9 db.collection('users'), 10 { idField: 'docId' } 11 ); 12 if (loading) return <div>Loading...</div>; 13 if (error) return <div>Error...</div>; 14 15 return ( 16 <React.Fragment> 17 <section> 18 <h2>一覧表示</h2> 19 {list.map(item => ( 20 <div key={item.docId + String(new Date())}> 21 <div>{item.name}</div> 22 <div>{item.email}</div> 23 <div><Link to={`/users/Detail/${item.docId}`}>詳細</Link></div> 24 </div> 25 ))} 26 </section> 27 </React.Fragment> 28 ); 29} 30 31export default Index;

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

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

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

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

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

guest

回答1

0

// コンソールログ結果: ▶︎Promise {<pending>}

すでに書いているように、Promiseが返ってきている以上、そのままmapはできません。

.thenで中身を取得するコールバックを書く必要があります。

投稿2020/05/01 06:23

maisumakun

総合スコア146018

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問