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

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

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

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

Cloud Firestore

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

TypeScript

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

Q&A

解決済

1回答

1065閲覧

Next.jsとCloud Firestoreのデータフェッチエラーを解決したい

nekonekonekko

総合スコア5

Next.js

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

Cloud Firestore

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

TypeScript

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

0グッド

0クリップ

投稿2021/08/29 03:49

前提

React(Next)でタイマーアプリを作っています。
Cloud Firestoreから「タスク:name、作業時間:time」をデータフェッチして、
グラフ(ApexCharts)にレンダリングすることを考えています。

一つ目のタスク(React勉強)と作業時間をグラフ化することはできています。
イメージ説明

実現したいこと

一つ目のタスク(React勉強)と二つ目のタスク(Vue勉強)を比較するようなグラフを作成したいです。

発生している問題・エラーメッセージ

F12でComponentsを確認したところ、二つ目のタスク(Vue勉強)に入るはずのデータフェッチができていません。

イメージ説明

data[]には、Cloud Firestoreで手動設定した以下のデータが入るはずです。

dataxy
1162954575300010
2162955800000030
3162973080000030
4162990360000045

該当のソースコード

Cloud Firestoreから「タスク:name、作業時間:time」をデータフェッチします。
src/util/firebase.js

JavaScript

1 getSeries = async(userId) => { 2 const getRecords = async(userId, categoryId) => { 3 let data = []; //ここにタスク1, 2, 3各々のname, timeを格納したいです。 4 const ref = db.collection('users').doc(userId).collection('record').where('categoryId', '==', categoryId); 5 try { 6 const querySnapshot = await ref.get(); 7 await Promise.all( 8 querySnapshot.docs.map((doc) => { 9 if (doc.exists) { 10 data.push({ x: doc.data().date, y: doc.data().time }); 11 } 12 }), 13 ); 14 return data; 15 } catch (e) { 16 throw e; 17 } 18 }; 19 20 let series = []; //ここにdata[0], data[1]を格納したいです。 21 const ref = this.categories.where('userId', '==', userId); 22 try { 23 await ref.get().then(async function(querySnapshot) { 24 await Promise.all( 25 querySnapshot.docs.map(async(doc) => { 26 if (doc.exists) { 27 const records = await getRecords(userId, doc.id); 28 series.push({ name: doc.data().name, data: records }); 29 } 30 }), 31 ); 32 }); 33 console.log('return'); 34 return series; 35 } catch (e) { 36 throw e; 37 } 38 };

グラフ(ApexCharts)に組み込む。
src/views/ApexCharts/index.tsx

TypeScript

1 2import React from 'react'; 3import ReactApexChart from 'react-apexcharts'; 4 5type GraphData = { 6 x: string; 7 y: number; 8}; 9 10type Series = { 11 name: string; 12 data: GraphData[]; 13}[]; 14 15type GraphProps = { 16 series: Series; 17}; 18 19const Graph: React.FC<GraphProps> = ({ series }) => { 20 const state = { 21 series: series, 22 options: { 23 chart: { 24 height: 350, 25 type: "area" || "line" || "bar" || "histogram" || "pie" || "donut" || "radialBar" || "scatter" || "bubble" || "heatmap" || "treemap" || "boxPlot" || "candlestick" || "radar" || "polarArea" || "rangeBar", 26 }, 27 dataLabels: { 28 enabled: false, 29 }, 30 stroke: { 31 curve: 'smooth', 32 }, 33 xaxis: { 34 type: 'datetime', 35 labels: { 36 datetimeFormatter: { 37 year: 'yyyy', 38 month: "MMM'yy", 39 day: 'MM/dd', 40 hour: 'HH:mm', 41 }, 42 }, 43 }, 44 tooltip: { 45 x: { 46 format: 'dd/MM/yy HH:mm', 47 }, 48 }, 49 }, 50 }; 51 52 //record内のdateに登録する値(number) 53 let date = new Date('2021/08/26').getTime(); 54 console.log(date); 55 56 return ( 57 <div id="chart"> 58 <ReactApexChart options={state.options} series={state.series} type="area" height={350} /> 59 </div> 60 ); 61};

レンダリングする。
src/pages/indexx.tsx

TypeScript

1const DynamicGraphComponentWithNoSSR = dynamic(() => import('../views/ApexCharts/index'), { ssr: false }); 2 3const Home = ({ currentUser }) => { 4 const [series, setSeries] = useState([]); 5 const getSeries = async (userId: string) => { 6 try { 7 const series = await firebase.getSeries(userId); 8 setSeries(series); 9 } catch (e) { 10 console.error(e); 11 } 12 }; 13 14 return ( 15 16 <div style={{ marginBottom: 40 }}> 17 <p className="title">作業時間</p> 18 <DynamicGraphComponentWithNoSSR series={series} /> 19 </div> 20 ); 21}; 22

補足情報(FW/ツールのバージョンなど)

{ "name": "pomodoro-clock", "version": "0.1.0", "private": true, "scripts": { "dev": "next dev", "build": "next build", "start": "next start" }, "dependencies": { "@material-ui/core": "^4.11.4", "@material-ui/icons": "^4.11.2", "apexcharts": "^3.27.1", "chart.js": "^3.3.2", "error": "10.4.0", "firebase": "^8.6.5", "next": "^11.1.0", "nookies": "^2.5.2", "react": "17.0.2", "react-apexcharts": "^1.3.9", "react-chartjs-2": "^3.0.3", "react-dom": "17.0.2", "react-heat-calendar": "^1.1.3", "react-lottie-player": "^1.3.1", "recharts": "^2.1.1", "swiper": "^6.6.2", "vue-chartjs": "^3.5.1" }, "devDependencies": { "@types/material-ui": "^0.21.8", "@types/node": "^15.3.0", "@types/react": "^17.0.6", "@types/react-dom": "^17.0.5", "typescript": "^4.2.4" } }

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

自己解決

Cloud Firestoreに登録していたcategoryIdの先頭にスペースが入っており、
データフェッチできていませんでした。

投稿2021/08/30 11:40

nekonekonekko

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問