@sayaka9876

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Reactのコンポーネントの読み込みはいつ行われるのか?

解決したいこと

React-Router-domを使用したルーティングを実装したアプリを作成しました。
そこで、ログイン後に表示できるページを実装したかったので、PrivateRouteとして、isAuthという認証を行う関数を使用し、認証されていればPrivate.jsを表示、そうでなければホームにリダイレクトするルートを追加しました。
Private.jsではSocketContext、VideoAppをロードするようにしました。

私の考えではこのPrivate.js内のコンポーネントが読み込まれてコードが実行されるのは、PrivateルートでisAuthの認証を通った時だと思っていたのですが、どうやらホームにアクセスした時点でコードが実行されているようです。
(SocketContext内で行なっているWebSocketのコネクションがホームにアクセスした時に起こっているので判明しました。)
なぜこのタイミングで実行されるのかが分かりません。

この場合、どのような処理をすればPrivate.js内のコンポーネントの読み込みを認証後に行うようにできるんでしょうか?

該当するソースコード

index.js
import React from 'react';
import ReactDOM from 'react-dom';
import Routes from './Routes';

ReactDOM.render(<Routes />, document.getElementById('root'));
Routes.js
import React from 'react';
import { BrowserRouter, Switch, Route } from 'react-router-dom';
import App from './App';
import Signup from './auth/Signup';
import Signin from './auth/Signin';
import Private from './core/Private';
import PrivateRoute from './auth/PrivateRoute';

const Routes = () => {
    return (
        <BrowserRouter>
            <Switch>
                <Route path="/" exact component={App} />
                <Route path="/signup" exact component={Signup} />
                <Route path="/signin" exact component={Signin} />
                <PrivateRoute path="/private" exact component={Private} />
            </Switch>
        </BrowserRouter>
    );
};

export default Routes;
PrivateRoute.js
import React, { Component } from 'react';
import { Route, Redirect } from 'react-router-dom';
//ユーザー認証 trueならPrivateルートに入ることができる
import { isAuth } from './helpers';

const PrivateRoute = ({ component: Component, ...rest }) => (
    <Route
        {...rest}
        render={props =>
            isAuth() ? (
                <Component {...props} />
            ) : (
                    <Redirect
                        to={{
                            pathname: '/signin',
                            state: { from: props.location }
                        }}
                    />
                )
        }
    ></Route>
);

export default PrivateRoute;
Private.js
import React from 'react';
import Layout from './Layout';
import VideoApp from './VideoApp';
//WebSocketの接続、react contextの設定など
import { SocketContext } from './SocketContext';

const Private = () => {
    return (
        <Layout>
            <SocketContext>
                <VideoApp />
            </SocketContext>
        </Layout>
    );
}

export default Private;

0 likes

1Answer

多分、検証しているコードを簡略化したコードがこのQAに書かれていると思うので、はっきりとはわかりませんが、

import Private from './core/Private';

このラインでPrivateコンポーネントが読み込まれているから、

SocketContext内で行なっているWebSocketのコネクションがホームにアクセスした時に起こっているので判明しました

が起きているのではないかと。

これを使って、必要最低限な箇所でコンポーネントを呼ぶとどうなりますか?

0Like

Your answer might help someone💌