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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Next.js

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

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

React.js

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

Q&A

2回答

949閲覧

Firestoreのデータの一覧表示を作りたい

tomsuma

総合スコア38

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Next.js

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

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

React.js

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

0グッド

0クリップ

投稿2020/10/11 13:18

編集2020/10/13 00:35

firebaseのデータ一覧を表示したいのですがうまくできません。

画面起動時にエラーが出ず、
console.log(doc.data())
でtitleなどの値が取れていて、
console.log(AllHandsOn)
でPromise {<pending>}
の値が取れてます
doc.data().titleで表示しようとしたのですが、
できず

import React from 'react' import { makeStyles } from '@material-ui/core/styles' import Card from '@material-ui/core/Card' import CardActionArea from '@material-ui/core/CardActionArea' import CardActions from '@material-ui/core/CardActions' import CardContent from '@material-ui/core/CardContent' import CardMedia from '@material-ui/core/CardMedia' import Button from '@material-ui/core/Button' import Typography from '@material-ui/core/Typography' import Divider from '@material-ui/core/Divider' import { db } from '../../firebase/index' const useStyles = makeStyles({ root: { maxWidth: 345, }, }) export default function ImgMediaCard() { const classes = useStyles() const AllHandsOn = db .collection('handsOn') .get() .then(function (querySnapshot) { querySnapshot.forEach(function (doc) { console.log(doc.data()) console.log(AllHandsOn) // doc.data() is never undefined for query doc snapshots }) }) return ( <Card className={classes.root}> <CardActionArea> <CardContent> <Typography gutterBottom variant="h5" component="h2"> {Object.title} </Typography> <Typography variant="body2" color="textSecondary" component="p"> {AllHandsOn.url} </Typography> </CardContent> </CardActionArea> <Divider /> <CardActions> <Button size="small" color="primary"> {AllHandsOn.tag} </Button> <Button size="small" color="primary"> Learn More </Button> </CardActions> </Card> ) }

試した事

Error: Objects are not valid as a React child (found: [object Promise]). If you meant to render a collection of children, use an array instead.
import React from 'react' import { makeStyles } from '@material-ui/core/styles' import Card from '@material-ui/core/Card' import CardActionArea from '@material-ui/core/CardActionArea' import CardActions from '@material-ui/core/CardActions' import CardContent from '@material-ui/core/CardContent' import CardMedia from '@material-ui/core/CardMedia' import Button from '@material-ui/core/Button' import Typography from '@material-ui/core/Typography' import Divider from '@material-ui/core/Divider' import { db } from '../../firebase/index' const useStyles = makeStyles({ root: { maxWidth: 345, }, }) export default function ImgMediaCard() { const classes = useStyles() const handsOnRef = db .collection('handsOn') .get() .then(function (querySnapshot) { querySnapshot.forEach(function (doc) { // doc.data() is never undefined for query doc snapshots console.log(doc.id, ' => ', doc.data()) }) }) return ( <Card className={classes.root}> <CardActionArea> <CardContent> <Typography gutterBottom variant="h5" component="h2"> {handsOnRef} </Typography> <Typography variant="body2" color="textSecondary" component="p"> a </Typography> </CardContent> </CardActionArea> <Divider /> <CardActions> <Button size="small" color="primary"> a </Button> <Button size="small" color="primary"> Learn More </Button> </CardActions> </Card> ) }

②試したこと

TypeError: doc.data is not a function

import React from 'react' import { makeStyles } from '@material-ui/core/styles' import Card from '@material-ui/core/Card' import CardActionArea from '@material-ui/core/CardActionArea' import CardActions from '@material-ui/core/CardActions' import CardContent from '@material-ui/core/CardContent' import CardMedia from '@material-ui/core/CardMedia' import Button from '@material-ui/core/Button' import Typography from '@material-ui/core/Typography' import Divider from '@material-ui/core/Divider' import { db } from '../../firebase/index' const useStyles = makeStyles({ root: { maxWidth: 345, }, }) class ImgMediaCard extends React.Component { constructor(props) { super(props) this.state = { title: '', url: '', tag: '', } } componentDidMount() { const doc = db.collection('handsOn').get() const data = doc.data() if (data) { this.setState({ title: data.title, url: data.url, tag: data.tag, }) } } render() { return ( <Card> <CardActionArea> <CardContent> <Typography gutterBottom variant="h5" component="h2"> {this.state.title} </Typography> <Typography variant="body2" color="textSecondary" component="p"> {this.state.url} </Typography> </CardContent> </CardActionArea> <Divider /> <CardActions> <Button size="small" color="primary"> {this.state.tag} </Button> <Button size="small" color="primary"> Learn More </Button> </CardActions> </Card> ) } } export default ImgMediaCard

イメージ説明

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

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

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

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

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

guest

回答2

0

お待たせして申し訳ございません。
こちらでいかがでしょう。

javascript

1class ImgMediaCard extends React.Component { 2 constructor(props) { 3 super(props); 4 this.state = { 5 list: [] 6 }; 7 } 8 9 componentDidMount() { 10 const list = []; 11 const doc = db.collection("handsOn").get() 12 .then((querySnapshot) => { 13 querySnapshot.forEach((doc) => { 14 list.push(doc.data()); 15 }); 16 console.log(list); 17 this.setState({ list: list }); 18 }) 19 .catch((error)=>{ 20 console.log(`データの取得に失敗しました (${error})`); 21 }); 22 } 23 24 } 25 26 render() { 27 const list = this.state.list; 28 console.log("list", list); 29 return ( 30 <Card> 31 <CardActionArea> 32 <CardContent> 33 {list.map(list => ( 34 <Typography gutterBottom variant="h5" component="h2"> 35 {list.title} 36 </Typography> 37 ))} 38 {list.map(list => ( 39 <Typography variant="body2" color="textSecondary" component="p"> 40 {list.url} 41 </Typography> 42 ))} 43 </CardContent> 44 </CardActionArea> 45 <Divider /> 46 {list.map(list => ( 47 <CardActions> 48 <Button size="small" color="primary"> 49 {list.tag} 50 </Button> 51 <Button size="small" color="primary"> 52 Learn More 53 </Button> 54 </CardActions> 55 ))} 56 </Card> 57 ) 58 } 59} 60export default ImgMediaCard

投稿2020/10/14 08:38

ug_o

総合スコア39

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

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

tomsuma

2020/10/17 01:13

ご回答頂き本当にありがとうございます! Parsing error: Unexpected token {eslint render() {  ここ const list = this.state.list; console.log("list", list); return ( <Card> このようなエラーが出てしまいます
tomsuma

2020/10/17 01:23

render の()を消しても駄目でした
ug_o

2020/10/20 05:43

} render() { 申し訳ございません。 ここに一個余分なコードが入っていました。確認不足でした。 render()の直前の } を削除してください。
guest

0

試していないので、できているか微妙ですがこんな感じはいかがでしょうか?

javascript

1import React from 'react' 2import { makeStyles } from '@material-ui/core/styles' 3import Card from '@material-ui/core/Card' 4import CardActionArea from '@material-ui/core/CardActionArea' 5import CardActions from '@material-ui/core/CardActions' 6import CardContent from '@material-ui/core/CardContent' 7import CardMedia from '@material-ui/core/CardMedia' 8import Button from '@material-ui/core/Button' 9import Typography from '@material-ui/core/Typography' 10import Divider from '@material-ui/core/Divider' 11import { db } from '../../firebase/index' 12const useStyles = makeStyles({ 13 root: { 14 maxWidth: 345, 15 }, 16}) 17export default function ImgMediaCard() { 18 constructor(props) { 19 super(props); 20 this.state = { 21 title: "", 22 url: "", 23 tag: "", 24 }; 25 } 26 27 componentDidMount(){ 28 const classes = useStyles(); 29 const doc = db.collection('handsOn').get(); 30 const data = doc.data(); 31 if(data) { 32 this.setState({ 33 title: data.title, 34 url: data.url, 35 tag: data.tag, 36 }); 37 } 38 } 39} 40 render() { 41 return ( 42 <Card className={classes.root}> 43 <CardActionArea> 44 <CardContent> 45 <Typography gutterBottom variant="h5" component="h2"> 46 {tihs.state.title} 47 </Typography> 48 <Typography variant="body2" color="textSecondary" component="p"> 49 {this.state.url} 50 </Typography> 51 </CardContent> 52 </CardActionArea> 53 <Divider /> 54 <CardActions> 55 <Button size="small" color="primary"> 56 {this.state.tag} 57 </Button> 58 <Button size="small" color="primary"> 59 Learn More 60 </Button> 61 </CardActions> 62 </Card> 63 ); 64 } 65}

投稿2020/10/12 00:52

ug_o

総合スコア39

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

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

tomsuma

2020/10/12 01:24

ご回答ありがとうございます! とても丁寧な対応感動です! しかし、各所でParsing error: Unexpected token が出てしまい、これで解決かわからない状況です
ug_o

2020/10/12 01:34

失礼しました! 下記に書き換えてみてください。 export default function ImgMediaCard() ↓ class ImgMediaCard extends React.Component 最終行 }の下に追加 export default ImgMediaCard; クラスコンポーネントのrender()を使用してしまったので、export default function App() { の関数コンポーネントと混ざってしまってエラーになっていたのだと思います。
tomsuma

2020/10/12 01:48 編集

ご回答ありがとうございます! render() {  ここでエラー return ( <Card className={classes.root}> <CardActionArea> <CardContent> <Typography gutterBottom variant="h5" component="h2"> {this.state.title} </Typography> <Typography variant="body2" color="textSecondary" component="p"> {this.state.url} </Typography> </CardContent> </CardActionArea> <Divider /> <CardActions> <Button size="small" color="primary"> {this.state.tag} </Button> <Button size="small" color="primary"> Learn More </Button> </CardActions> </Card> ); } } のところでもParsing error: Unexpected token のエラーがあります。 大変お手数ですが何故か分かるようならご教授お願いします
ug_o

2020/10/12 01:54

render()上の } が余分に多いのが原因かもしれないです… 1つ削ってみてください。
tomsuma

2020/10/13 00:36

お付き合いいただき本当にありがとうございます!! やはり駄目でした。。 上記に追加しました
ug_o

2020/10/13 09:14 編集

すみません。以前の記述だとドキュメントを指定しないといけないようでした。 別の方法を検討してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問