前提
Next(React)でポモドーロタイマーアプリを作っています!
現状以下のコードでApexChartsを用いたグラフの描画ができております。
ApexCharts
src/views/ApexCharts/index.tsx
JavaScript
1import React, { Component, useState, useEffect } from 'react'; 2import { db } from '../../../lib/db'; 3import ReactApexChart from 'react-apexcharts'; 4 5class Graph extends Component<{}, { series: any[]; options: any }> { 6 constructor(props) { 7 super(props); 8 9 this.state = { 10 series: [ 11 { 12 name: 'React', 13 data: [31, 40, 28, 51, 42, 109, 100], 14 }, 15 { 16 name: 'Next', 17 data: [11, 32, 45, 32, 34, 52, 41], 18 }, 19 ], 20 options: { 21 chart: { 22 height: 350, 23 type: 'area', 24 }, 25 dataLabels: { 26 enabled: false, 27 }, 28 stroke: { 29 curve: 'smooth', 30 }, 31 xaxis: { 32 type: 'datetime', 33 categories: [ 34 '2021-06-10T00:00:00.000Z', 35 '2021-06-11T01:30:00.000Z', 36 '2021-06-12T02:30:00.000Z', 37 '2021-06-13T03:30:00.000Z', 38 '2021-06-14T04:30:00.000Z', 39 '2021-06-15T05:30:00.000Z', 40 '2021-06-16T06:30:00.000Z', 41 ], 42 labels: { 43 datetimeFormatter: { 44 year: 'yyyy', 45 month: "MMM'yy", 46 day: 'MM/dd', 47 hour: 'HH:mm', 48 }, 49 }, 50 }, 51 tooltip: { 52 x: { 53 format: 'dd/MM/yy HH:mm', 54 }, 55 }, 56 }, 57 }; 58 } 59 60 render() { 61 return ( 62 <div id="chart"> 63 <ReactApexChart options={this.state.options} series={this.state.series} type="area" height={350} /> 64 </div> 65 ); 66 } 67} 68 69export default Graph; 70
ホーム画面
pages/index.tsx
JavaScript
1import React, { useState, useEffect, useContext } from 'react'; 2import dynamic from 'next/dynamic'; 3import firebase from 'util/firebase'; 4import styles from '../styles/auth.module.css'; 5 6//ApexCharts読み込むのにNext.jsで必要な設定 7const DynamicGraphComponentWithNoSSR = dynamic(() => import('../views/ApexCharts/index'), { ssr: false }); 8 9const Home = ({ currentUser }) => { 10 11 return ( 12 <div className="container"> 13 <div style={{ marginBottom: 40 }}> 14 <p className="title">作業時間</p> 15 <React.StrictMode> 16 <DynamicGraphComponentWithNoSSR /> 17 </React.StrictMode> 18 </div> 19 20 </div> 21 <SimpleBottomNavigation /> 22 </div> 23 ); 24}; 25 26export default Home; 27
グラフ
実現したいこと
DB連携
上記のように、現状ではApexChartsのデータはコードに手動で加えたものであり、実践的な内容ではありません。
そこで、タイマーの時間をFirebaseのCloudFirestoreから取得しApexChartsのグラフを実装中に以下のエラーメッセージが発生しました。
CloudFirestore
発生している問題・エラーメッセージ
Unhandled Runtime Error Error: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons: 1. You might have mismatching versions of React and the renderer (such as React DOM) 2. You might be breaking the Rules of Hooks 3. You might have more than one copy of React in the same app See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.
該当のソースコード
ApexCharts:src/views/ApexCharts/index.tsx
JavaScript
1... 2 3class Graph extends Component<{}, { series: any[]; options: any }> { 4 constructor(props) { 5 super(props); 6 7 const [chartcategories, setChartCategories] = useState([]); 8 useEffect(() => { 9 const unSub = db.collection("categories").onSnapshot((snapshot)=>{ // CloudFirebaseのcategoriesコレクションのデータを取得 10 setChartCategories( 11 snapshot.docs.map((doc)=>({name: doc.data().name, time: doc.data().time})) 12 ); 13 }); 14 return ()=> unSub(); 15 }, []); 16 17 {chartcategories.map((categroy) => 18 <h3>{categroy.name}</h3> 19 )} 20...
試したこと
React Hooksの書き方がまずいのだと思いますが改善できておりません。
他にも、CloudFirestoreからデータを取得してグラフ化するという検索ワードでヒットした記事を読んでいますが、
Next.jsではなくVue.jsを用いた情報が多く、グラフもApexChartsではなくChart.jsのほうが情報が多く解決策を得られません。
CloudFireStoreから取得したデータをApexChartsのデータ要素として扱う寳保を教えていただきたいです!
補足情報(FW/ツールのバージョンなど)
package.json
"dependencies": { "firebase": "^8.6.5", "next": "10.2.1", "apexcharts": "^3.27.1", "chart.js": "^3.3.2", "react": "17.0.2", "react-dom": "17.0.2", }, "devDependencies": { "@types/node": "^15.3.0", "@types/react": "^17.0.6", "@types/react-dom": "^17.0.5", "typescript": "^4.2.4" }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。