2017-12-10 30 views
1

私はReact Routerを使用しているアプリケーションで作業していますが、Reduxストアの変更によって現在のルートが参照しているコンポーネントが再描画されているルート自体を再レンダリングするのではなく、コンポーネントを再レンダリングするのではなく、ルータを再レンダリングするルータ

この問題を説明するには、私は、ユーザーが現在ログインしているかどうかを確認するPrivateRouteを実装している、それはこのようなものに見える、それは最も基本的なフォームのでは:。

<PrivateRoute path="/" component={HomePage}/> 
:私は今、このような何かを言うことができるので、これは素晴らしい作品

const PrivateRoute = ({component: Component, ...rest}) => { 
    return <Route {...rest} render={(props) => { 
    const state = store.getState() 

    if (state.isAuthenticated) { 
     return <Component {...props}/> 
    } 
    else { 
     return <Redirect to={{pathname: '/login'}}/ 
    } 
    }}/> 
}) 

しかし、の状態が変更され、リアクタールーターがHomePageコンポーネントのrenderメソッドを呼び出すのではなく、ルートを再レンダリングすることに気付きました。つまり、ユーザーがあるページからホームページに移動したときにアプリケーションが認証チェックを行いますが、ホームページではそのチェックはもう行われません。

私は現時点で、認証チェックをコンポーネントの機能(明らかに所属していない場所)に移動することしかできません。

React Routerは、状態が変わったときにルートが参照するコンポーネントを再レンダリングするのではなく、ルートを再レンダリングさせることができますか?

+0

あなただけの店の変数から状態を取得するのではなく、認証状態に 'PrivateRoute'を接続することはできません?私はレンダリングツリーは、いくつかの状態変更に基づいて 'PrivateRoute'内の変更を認識していないと信じています – Icepickle

+0

私はあなたのコメントの最初の文/質問を理解していません。私は、React Routerがルートのレンダリングメソッドを一度だけ呼び出すと思う(ルートパスがヒットしたとき)。その後、ルート上でレンダリングを再度呼び出さず、ルートによって返されたコンポーネント上でのみレンダリングを呼び出します。私はこれがリアクタの問題だと思う。私は周りのエレガントな作品を探しています。 – Luke

+0

ほとんどあなたの答えであなたが実際にしたことをお勧めしました。 – Icepickle

答えて

1

ルートで認証チェックを実装するのではなく、高次コンポーネントを使用して問題を解決することができました。

function withEnsureAuthentication(WrappedComponent) { 
    return class extends React.Component { 
    render() { 
     if (this.props.store.isAuthenticated === false) { 
     return <Redirect to={{pathname: '/login'}}/> 
     } 

     return <WrappedComponent {...this.props}/> 
    } 
    } 
} 

あなたは今、通常のRouteを使用しますが、コンポーネントにwithEnsureAuthenticationを適用することができます。

const HomePage = withEnsureAuthentication(Home) 

<Route path="/home" component={HomePage}/> 
関連する問題