前提
React(Next)でタイマーアプリを作っています。
Cloud Firestoreから「タスク:name、作業時間:time」をデータフェッチして、
グラフ(ApexCharts)にレンダリングすることを考えています。
一つ目のタスク(React勉強)と作業時間をグラフ化することはできています。
実現したいこと
一つ目のタスク(React勉強)と二つ目のタスク(Vue勉強)を比較するようなグラフを作成したいです。
発生している問題・エラーメッセージ
F12でComponentsを確認したところ、二つ目のタスク(Vue勉強)に入るはずのデータフェッチができていません。
data[]には、Cloud Firestoreで手動設定した以下のデータが入るはずです。
data | x | y |
---|---|---|
1 | 1629545753000 | 10 |
2 | 1629558000000 | 30 |
3 | 1629730800000 | 30 |
4 | 1629903600000 | 45 |
該当のソースコード
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" } }
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。