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

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

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

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

Next.js

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

Cloud Firestore

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

1734閲覧

CloudFirestoreのデータをグラフ化したい

nekonekonekko

総合スコア5

Firebase

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

Next.js

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

Cloud Firestore

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/08/14 15:17

編集2021/08/14 15:18

前提

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" }

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

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

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

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

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

guest

回答1

0

ベストアンサー

重要なこととして、Reactのフックは関数コンポーネントのための機能であり、クラスコンポーネントで使うものではありません。
ApexChartsはクラスコンポーネントでなので、Hooksを使えません。

考え方としては、以下のどちらかが必要です。(細かい書き方等は省きます)

  • 関数コンポーネントに書き換える
  • クラスコンポーネントのまま、必要なタイミングでFirestoreにアクセスするように実装する

もし、ApexChartsが実質Firestoreからのデータフェッチとそのレンダリング(render,useEffectなど)しか行わないのであれば、比較的容易ではあるかなと思います。

もし、関数コンポーネントへの書き換えがそれなりに大変そうであれば、useEffectに近い位置づけになるcomponentDidMountなどのメソッドにデータ取得を実装する感じになるでしょうか。

いずれにせよ、「どうしたいか」に依存しがちな話ではあるので、Reactのドキュメントを読み返しつつ検討してみてください。

投稿2021/08/14 16:26

attakei

総合スコア2740

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問