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

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

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

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

React.js

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

Q&A

解決済

1回答

1260閲覧

[React] 訳のわからないエラーについて

DaisukeMori

総合スコア225

Firebase

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

React.js

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

0グッド

0クリップ

投稿2020/08/10 14:15

Reactで開発している際、以下のようなエラーがというかWarningがでました。
このWarningがでてから、Reactの保存が遅くなりました。
これは何が原因なのでしょうか?

cosole

1Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function. 2 in WorksDetail (created by Context.Consumer)

以下ファイルを追加した後、おかしくなりました。
一覧 → 詳細画面のページ

jsx

1import React, { useState } from 'react'; 2import { db } from '../../Firebase'; 3import PcImage from '../../assets/img/portfolio/PC.png' 4 5const WorksDetail = (props) => { 6 const [ works, setWorks ] = useState([]); 7 8 const docId = props.match.params.id; 9 const docRef = db.collection('works').doc(docId); 10 11 docRef.get().then((doc) => { 12 if (doc.exists) { 13 const docData = doc.data(); 14 setWorks(docData); 15 } else { 16 console.log('No such document!'); 17 } 18 }) 19 .catch(function(error) { 20 console.log('Error getting document:', error); 21 }); 22 23 return ( 24 <> 25 <h2>Portfolio</h2> 26 <div className="article"> 27 <h3>Work</h3> 28 <section className="work"> 29 <img src={ works.imagePath1 } className="left-work" alt={works.main} /> 30 <div className="right-work"> 31 <div className="sub-text">{works.sub}</div> 32 {works.url ? ( 33 <div className="main-text link"> 34 <img src={PcImage} alt="pc icon" /> 35 <a href={works.url} rel="noreferrer noopener" target="_blank">{works.main}</a> 36 </div> 37 ) : ( 38 <div className="main-text">{works.main}</div> 39 )} 40 <div className="description">{works.description}</div> 41 <h3>○主な読者層</h3> 42 <div className="target">{works.target}</div> 43 <h3>○主な内容</h3> 44 <div className="content">{works.content}</div> 45 </div> 46 </section> 47 </div> 48 <style>{` 49 .work { 50 display: flex; 51 justify-content: space-between; 52 } 53 .work .left-work { 54 width: 300px; 55 height: 270px; 56 object-fit: cover; 57 margin: 0 25px 0 0; 58 } 59 .work .right-work .sub-text { 60 font-size: 15px; 61 font-weight: bold; 62 } 63 .work .right-work .main-text { 64 font-size: 20px; 65 font-weight: bold; 66 margin: 0 0 15px 0; 67 } 68 .work .right-work .link a { 69 color: #1D60FE; 70 } 71 .work .right-work .link img { 72 margin: 0 10px 0 0; 73 top: 3px; 74 position: relative; 75 } 76 .work .right-work .description, 77 .work .right-work .target, 78 .work .right-work .content { 79 text-align: justify; 80 font-size: 14px; 81 line-height: 1.5; 82 margin: 0 0 20px 0; 83 } 84 .work .right-work h3 { 85 margin: 0; 86 } 87 `}</style> 88 </> 89 ); 90} 91 92export default WorksDetail;

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

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

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

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

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

gentaro

2020/08/10 14:35

コードまでは見てませんが、めちゃくちゃ丁寧なエラーメッセージが出ていて、原因や修正するためのヒントまで書いてありますね。 それを読んで具体的に何がわからなかったのかを質問文に書かれてはどうでしょうか。
DaisukeMori

2020/08/10 14:49

警告:マウント解除されたコンポーネントでReact状態の更新を実行できません。 これは何もしませんが、アプリケーションのメモリリークを示しています。 修正するには、useEffectクリーンアップ関数ですべてのサブスクリプションと非同期タスクをキャンセルします。 WorksDetail(Context.Consumerにより作成) Google翻訳で翻訳してみましたが「useEffectクリーンアップ関数ですべてのサブスクリプションと非同期タスクをキャンセルします。」の意味がさっぱりわかりません。
guest

回答1

0

ベストアンサー

関数コンポーネントの中に直接書いたコードは、描画のたびに実行されます。つまり、元のコードではdocRef.get()が毎回実行されてしまうことになります。

実行タイミングを制御したいものは、useEffectの中に書いてください。

投稿2020/08/10 22:34

maisumakun

総合スコア145183

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

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

DaisukeMori

2020/08/11 04:53

``` useEffect(() => { const docId = props.match.params.id; const docRef = db.collection('works').doc(docId); docRef.get().then((doc) => { if (doc.exists) { const docData = doc.data(); setWorks(docData); } else { console.log('No such document!'); } }) .catch(function(error) { console.log('Error getting document:', error); }); }, []); ``` useEffectの中に入れたらWarningは消えた代わりに別のコメントが出ました。 ``` React Hook useEffect has a missing dependency: 'props.match.params.id'. Either include it or remove the dependency array react-hooks/exhaustive-deps ```
DaisukeMori

2020/08/11 05:05

追記で更新自体は高速になりました。 これはこのままスルーしても問題ないでしょうか?
DaisukeMori

2020/08/12 05:59

追記で useEffectに入れた際Lintエラーを消す方法 ``` useEffect(() => { // 省略 }, [props.match.params.id]); // props.match.params.idを第二引数の配列に入れる ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問