前提・実現したいこと
コンポーネントがunmountされた後に参照されるのを防ぎたい。
発生している問題・エラーメッセージ
reactとfirebaseで作っているアプリで、会員認証機能を作成しているのですが、ログインのボタンをクリックした際に、consoleにて以下のエラーが発生します。
Warning: 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. in Login (created by Context.Consumer) in Route (at App.jsx:30)
ググってみた限り、useeffectでのクリーンアップ関数関連の問題で、コンポーネントが破棄された後に参照されている(?)からエラーが起きているようです。
該当のソースコード
すみませんuseefectがうまくいかないというタイトルですが、そもそも今回の場合、どのようにしてuseeffectを使ってクリーンアップすれば良いのかがわかりません。
Login
1import React, { useRef, useState, useEffect } from "react" 2import { Form, Button, Card, Alert } from "react-bootstrap" 3import { useAuth } from "../contexts/AuthContext" 4import { Link, useHistory } from "react-router-dom" 5 6export default function Login() { 7 const emailRef = useRef() 8 const passwordRef = useRef() 9 const { login } = useAuth() 10 const [error, setError] = useState("") 11 const [loading, setLoading] = useState(false) 12 const history = useHistory() 13 14 async function handleSubmit(e) { 15 e.preventDefault() 16 17 try { 18 setError("") 19 setLoading(true) 20 await login(emailRef.current.value, passwordRef.current.value) 21 history.push("/") 22 } catch { 23 setError("ログインに失敗しました") 24 } 25 26 setLoading(false) 27 } 28 29 return ( 30 <> 31 <Card> 32 <Card.Body> 33 <h2 className="text-center mb-4">ログイン</h2> 34 {error && <Alert variant="danger">{error}</Alert>} 35 <Form onSubmit={handleSubmit}> 36 <Form.Group id="email"> 37 <Form.Label>Email</Form.Label> 38 <Form.Control type="email" ref={emailRef} required /> 39 </Form.Group> 40 <Form.Group id="password"> 41 <Form.Label>パスワード</Form.Label> 42 <Form.Control type="password" ref={passwordRef} required /> 43 </Form.Group> 44 <Button disabled={loading} className="w-100" type="submit"> 45 ログインする 46 </Button> 47 </Form> 48 <div className="w-100 text-center mt-3"> 49 <Link to="/forgot-password">パスワードを忘れた場合はこちら</Link> 50 </div> 51 </Card.Body> 52 </Card> 53 <div className="w-100 text-center mt-2"> 54 アカウントがない場合は? <Link to="/signup">サインアップ</Link> 55 </div> 56 </> 57 ) 58} 59
AuthContext
1 2 function login(email, password) { 3 return auth.signInWithEmailAndPassword(email, password) 4 }
ライフサイクルやfirebase、そもそもJavaScriptについて無知なのは重々承知ですが、ご教授お願いいたします。
あなたの回答
tips
プレビュー