2017-05-17 1 views
0

私はPersonCreateというコントローラを持っています。このコンポーネントでは、認証されたユーザー(this.props.app.session.user.role.isAdmin())の役割をチェックし、値に応じて何らかのフォームをレンダリングする必要があります。私が真を返さない限りコンポーネントの取り付けを延期する

問題は、セッションオブジェクトを生成するのに時間がかかることです。 http://.../person/createのエンドポイントを参照すると、セッションがまだ生成されていないため、NULLポインタ例外をスローするthis.props.app.session.user.role.isAdmin()を呼び出しようとします。

ルーターファイルは次のようになります。

class RootComponent extends React.Component<any, any> { 

    private generateSession() { 
    store.dispatch(SessionActions.generate()); 
    } 

    public render() { 
    return (
     <Router history={browserHistory}> 
     <Route path="/" component={Layout}> 
      <Route path="app" onEnter={this.generateSession}> 
      <Route path="person"> 
       <Route path="create" component={PersonCreate} /> 
       <Route path="update/:id" component={PersonUpdate} /> 
       <Route path="delete/:id" component={PersonDelete} /> 

    ... 

基本的にstore.dispatch(SessionActions.generate())はasyncronousもののシリーズを行いSagaを生成しました。 (トークンの検証、セッション情報の取得、ローカルストレージのリフレッシュなど)。完了後にコンポーネントのレンダリングを開始する必要があります。

アイデア?

+1

あなたが見ている問題:あなたはここにこのアプローチの詳細を読むことができ

render() { if (isLoggedIn) { return <AppropriateUserForm />; } else { return <LoadingIndicator />; } } 

<Route path=”/” component={App}> <Route path=”cart” component={Cart}/> <Route path=”login” component={Login}/> <Route component={EnsureLoggedInContainer}> <Route path=”checkout” component={Checkout}/> <Route path=”account” component={Account}/> </Route> </Route> 

そして、この「親」で

は中(EnsureLoggedInContainer)コンポーネントは次のような何かをレンダリングレンダリングハイジャックと呼ばれています。あなたはそれについてgoogleすることができます。これを行う最善の方法は 'HOC'です。 Readmore on it [here](https://medium.com/@franleplant/react-higher-order-components-in-depth-cf9032ee6c3e)。一度読んだら、何か問題があれば、私たちに連絡してください。 – Panther

答えて

1

あなたはこのようRootComponentのチェックを使用することができます。

public render() { 
    if (!this.props.app.session) { 
    return null; 
    } 

、それは、セッションが初期化されます後にのみ、ルートをレンダリングします。

PersonCreateコンポーネントでも同様のチェックを使用できます。

+0

これは認証なしでいくつかのルートをレンダリングする必要があります。 (サインインなど)既にこれを試しました。 – Aris

+0

私が言及したように、あなたは 'PersonCreate'や他のコンポーネントの中でそのようなチェックを使うことができます – lunochkin

+0

それは良い解決策ではありません。何百ものコンポーネントで同じロジックを複製することはできません。 – Aris

関連する問題