2016-07-26 14 views
10

Obecnie tworzę stronę internetową, na której użyłem systemu reagowania, routera reakcji i redux. Wykonujemy renderowanie po stronie serwera i za pomocą routera reagujemy również na serwerze. Teraz mam przypadek, w którym chcę, aby strona klienta renderowała inny komponent niż serwer. Chcę tak.Renderuj różne komponenty po stronie klienta i serwera.

Side Client

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

Server Side

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

mam przypadek użycia takiego kiedy użytkownik click to obraz chcę otworzyć modalnego z treścią i polecić obrazów. gdy użytkownik kliknie na polecane obrazy, ten sam modalny powinien wypełnić dane i chcę również zmienić trasę. Ta sama trasa po otwarciu w nowym oknie powinna otworzyć stronę html dla Facebooka i google, aby usunąć z niej metatagi.

Tak więc albo renderuję inny komponent na kliencie i serwerze. Ale to też ma problem, ponieważ wtedy muszę znaleźć sposób na wyłączenie routera reagującego po stronie klienta, gdy serwer obsługuje renderowaną stronę.

Lub po stronie klienta wygenerować zmianę pseudo trasy, która zmienia adres URL, ale nie renderuje komponentu.

+0

Hej @Priyank Bhatt czy znalazłeś sposób, aby to osiągnąć? – davelab

+0

Yup Mam rozwiązanie, ale to głównie hack. Więc to co zrobiłem to. Usuwam całą zawartość z window.intial__state, gdy tylko są w niej zawarte. Używając routera reagującego getComponent, sprawdziłem, czy okno window.intial__ jest puste, jeśli jest to routing uruchamiany od strony klienta, więc wyrenderuj ten komponent. A jeśli window__intialstate nie jest pusty, to wyrenderuj inny komponent.

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

+0

'funkcja onUpdate() { jeśli (okno .__ INITIAL_STATE__! == null) { okno .__ INITIAL_STATE__ = null; return; } } ' –

Odpowiedz

3

Sprawdź, czy window jest obecny i warunkowo ustawić składnik, którego chcesz używać tak:

let Handler; 

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

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

kłopoty we mnie chce wiedzieć, dlaczego to robisz :)

+0

Mam przykład użycia, gdy użytkownik kliknie obraz, który chce otworzyć modal z zawartością i poleca obrazy. gdy użytkownik kliknie na polecane obrazy, ten sam modalny powinien wypełnić dane i chcę również zmienić trasę. Ta sama trasa po otwarciu w nowym oknie powinna otworzyć stronę html dla Facebooka i google, aby usunąć z niej metatagi. –

+0

Brzmi fajnie, mam nadzieję, że to pomaga. –

+0

Ale nie sądzę, że byłoby to przydatne, ponieważ za każdym razem, gdy serwer renderował strony, klient ponownie sprawdza trasę w trybie reagowania routera i będzie renderował modal zamiast strony html. –

1

proces wyboru. env.Browser

let Handler; 

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

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

To rozwiązanie nie działa. proszę przeczytać przypadek użycia. Gdy serwer wysyła stronę renderowania, router po stronie klienta ponownie sprawdza, czy komponent URL i komponent klienta renderowania jest poprawny. Więc zawsze komponent po stronie klienta będzie renderowany.Potrzebuję sposobu na ominięcie routera reagującego po stronie klienta, jeśli serwer obsługuje tylko stronę, wtedy to rozwiązanie może działać. –

Powiązane problemy