1

私は、componentDidMountイベントで開始されたユーザーのID番号を取得する非同期要求が行われるプロファイルページにユーザーを導くログインページを持っています。結果が戻ったら、取得したデータでIDにsetStateを設定します。マウントされたコンポーネントまたはマウントされているコンポーネントのエラーのみを更新できます。条件付きレンダリング

import React, { Component } from 'react'; 
import {Navbar} from 'react-materialize'; 
import {Link, Redirect} from 'react-router-dom'; 
import helper from '../utils/helper'; 
import axios from 'axios'; 
import logo from '../logo.svg'; 
import '../App.css'; 

class Profile extends Component { 
    constructor(props){ 
    super(props); 
    this.state = {id: null, loggedIn: true}; 
     this.logOut = this.logOut.bind(this); 

    } 

    componentDidMount(){ 
    axios.get('/profile').then((results) => { 
     if(!this._unmounted) { 
     this.setState({id: results.data}) 
     }  
    }) 
    } 

    logOut(event){ 
    axios.post('/logout').then((results) => { 
     console.log(results); 
    }) 
    this.setState({loggedIn: false}); 
    } 

    render() { 
    if(!this.state.loggedIn){ 
     return <Redirect to={{pathname: "/"}}/> 
    } 
    if(this.state.id == null){ 
     return <Redirect to={{pathname: "/login"}} ref="MyRef" /> 
    } 

    return (
     <div> 
     <Navbar brand='WorldScoop 2.0' right> 
      <ul> 
      <li><Link to="#" onClick={this.logOut}>Logout</Link></li> 
      </ul> 
     </Navbar> 
     <h1>Profile Page</h1> 
     <h2>Welcome {this.state.id} </h2> 
     </div> 
    ) 
    } 
} 
export default Profile; 

誰かがURLに '/ profile'パスを入力してプロフィールページに移動できないようにしようとしています。これを行うには、私はidが適切なログインauthentication.Thatから取得されたかどうかに基づいて、条件付きのレンダリングを使用すると、

if(this.state.id == null){ 
    return <Redirect to={{pathname: "/login"}} ref="MyRef" /> 
} 

に気付いた場合、彼らはメールアドレスとパスワードを指定しない場合、これは、ログインページに戻って、ユーザーをリダイレクトする理由です試してみました。データを受信した後にプロファイルコンポーネントのマウントとアンマウントを確認しようとしましたが、エラーメッセージが表示されたままです。 マウントされたコンポーネントまたはマウントされているコンポーネントのみをアップデートできます。コンポーネントがアンマウントすると混乱します。

+0

現在、ユーザーを/ loginにリダイレクトするコードはありますか? – Joey

+0

私はユーザー資格情報を追加しても同じエラーで/ loginにリダイレクトされます。何らかの理由で、this.setState({id:results.data})。検索されたユーザーIDで状態を設定していません。私は条件付きのif(this.state.id == null){ return <パス名: "/ login"}} ref = "MyRef" /> }を追加するとこの問題が発生します。 – dalt25

+0

yup thatsあなたのレンダリングメソッドが解決しているので、Axiosコールが終了する前にあなたに経路を変更しているので、 – Joey

答えて

0

方法は、通常のローディングインジケータが使用されている、あなたのaxios通話が終了する前に、あなたを再ルーティングするので、解決策は、あなたの通話が終了する前に場所を変更しないことですので、そのための解決されてレンダリングします。また、ライフサイクルフックをdidMountからwillMountに変更し、状態がレンダリングの前に反映されるようにしました。

import React, { Component } from 'react'; 
import {Navbar} from 'react-materialize'; 
import {Link, Redirect} from 'react-router-dom'; 
import helper from '../utils/helper'; 
import axios from 'axios'; 
import logo from '../logo.svg'; 
import '../App.css'; 

class Profile extends Component { 
    constructor(props){ 
    super(props); 
    this.state = {id: null, loggedIn: true, loading: false}; 
     this.logOut = this.logOut.bind(this); 

    } 

    componentWillMount(){ 
    this.setState({ loading: true }); 
    axios.get('/profile') 
    .then((results) => { 
     // usually data is an object so make sure results.data returns the ID 
     this.setState({id: results.data, loading: false}) 
     }) 
    .catch(err => { 
     this.setState({ loading: false, id: null }) 
     }) 
    } 

    logOut(event){ 
    axios.post('/logout').then((results) => { 
     console.log(results); 
    }) 
    this.setState({loggedIn: false}); 
    } 

    render() { 
    if(!this.state.loggedIn){ 
     return <Redirect to={{pathname: "/"}}/> 
    } 
    if (this.state.loading) return <div>loading...</div> 
    if(this.state.id == null){ 
     return <Redirect to={{pathname: "/login"}} ref="MyRef" /> 
    } 

    return (
     <div> 
     <Navbar brand='WorldScoop 2.0' right> 
      <ul> 
      <li><Link to="#" onClick={this.logOut}>Logout</Link></li> 
      </ul> 
     </Navbar> 
     <h1>Profile Page</h1> 
     <h2>Welcome {this.state.id} </h2> 
     </div> 
    ) 
    } 
} 
export default Profile; 
+0

私はこれを試そうとしています。ローダーは自分で作ったコンポーネントですか? – dalt25

+0

もしあなたが1つしか持っていないのであれば '

loading...
' – Joey

+0

あなたの答えは部分的にうまくいっています。私はユーザーの資格情報でログインすることができますが、私が "チート"してURLに '/ profile'のパスを入力しようとすると、 'loading' divに移動してそこにとどまります。しかし、私を一歩近づけてくれてありがとう!私はローディングの問題でもあると感じました。 – dalt25

1

あなたはコンポーネントがthis._isunmountedでマウントまたはアンマウントされているかどうかを確認したい場合は、componentWillUnmountでそれが本当行う必要があります。

componentWillUnmount() { 
    this._isunmounted = true; 
} 
+1

にはメソッド 'this.isMounted()'が組み込まれていますが、コンポーネントがマウントされているかどうかを確認するのは悪い考え方です。 https://reactjs.org/blog/2015/12/16/ismounted-antipattern.html – Joey

関連する問題

 関連する問題