2016-07-26 14 views
10

私は現在、私がreact、react-router、およびreduxを使用しているWebサイトを開発しています。私たちは、サーバー側のレンダリングを行い、サーバー上の反応ルータも使用しています。今私は、クライアント側がサーバー側とは異なるコンポーネントをレンダリングしたい場合があります。私はこのようにしたい。クライアント側とサーバー側で異なるコンポーネントをレンダリングする

クライアント側

<Route path="welcome/:id" component={Home} /> 

サーバー側

<Route path="welcome/:id" component={App} /> 

私は、ユーザーのクリックが、私は内容でモーダルを開き、画像をお勧めしたい画像だときのようなユースケースを持っています。ユーザーがクリックしたときに推奨画像が表示されます。同じモーダルで詳細を入力する必要があります。また、経路も変更したいと考えています。新しいウィンドウで開いたときと同じルートは、facebookのhtmlページを開き、そこからメタタグをスクラップするようにgoogleする必要があります。

したがって、クライアントとサーバーで異なるコンポーネントをレンダリングします。しかし、それも問題があります。なぜなら、サーバーがレンダリングされたページを提供しているときに、クライアント側の反応ルータをオフにする方法を見つける必要があるからです。

または、クライアントサイドでは、URLを変更するがコンポーネントをレンダリングしない疑似ルート変更を生成します。

+0

こんにちは@Priyank Bhattあなたはこれで達成する方法を見つけましたか? – davelab

+0

私は解決策を得ましたが、ほとんどがハックです。だから私は何をしたのですか?私はwindow.intial__stateから内容がすべて入っているときは、その内容をすべて削除します。そして、react-router getComponentを使って、window.intial__stateが空であるかどうかを調べました。クライアント側からルーティングがトリガーされるので、そのコンポーネントをレンダリングします。 window__intialstateが空でない場合は、他のComponentをレンダリングします。

function onUpdate() { if (window.__INITIAL_STATE__ !== null) { window.__INITIAL_STATE__ = null; return; } }

+0

'function onUpdate(){ if(window .__ INITIAL_STATE__!== null){ window .__ INITIAL_STATE__ = null; リターン; } } < –

答えて

3

チェックwindowが存在し、条件付きで、あなたはこのように使用するコンポーネントに設定した場合:私の中

let Handler; 

if (typeof window !== 'undefined') { 
    Handler = Home; 
} else { 
    Handler = App; 
} 

return <Route path="welcome/:id" component={Handler} /> 

トラブルは、あなたがこの:)

+0

ユーザのクリック画像のような使用事例があります。コンテンツ付きのモーダルを開き、画像を推奨したいと思います。ユーザーがクリックしたときに推奨画像が表示されます。同じモーダルで詳細を入力する必要があります。また、経路も変更したいと考えています。新しいウィンドウで開いたときと同じルートは、facebookのhtmlページを開き、そこからメタタグをスクラップするようにgoogleする必要があります。 –

+0

クールな音、これが役立つことを願っています。 –

+0

しかし、私はこれが役に立つと思うので、サーバがレンダリングされるたびに、クライアントは反応ルータのルートをチェックし、HTMLページの代わりにモーダルをレンダリングするので便利です。 –

1

チェック処理をやっている理由を知りたがっています。 env.Browser

let Handler; 

if (process.env.browser) { 
    Handler = Home; 
} else { 
    Handler = App; 
} 

return <Route path="welcome/:id" component={Handler} /> 
+0

このソリューションは動作しません。ユースケースをお読みください。サーバがレンダリングページを送信すると、クライアント側のリアクションルータは、URLとレンダリングのクライアント側コンポーネントを再度チェックします。したがって、常にクライアント側コンポーネントがレンダリングされます。サーバーがページを提供している場合にのみ、このソリューションが機能することができるように、クライアント側の反応ルータをバイパスする方法が必要です。 –

関連する問題