2016-04-09 18 views
7

Używam routera reagowania z historią useQueries(createHashHistory)() i mam kilka tras, które chcę uniemożliwić nawigacji w oparciu o konfigurację trasy.
Więc trasy config jest jak:Reaktor routera: zapobieganie nawigacji do celu trasy

<Route path="/" name={RouteNames.APP} component={AppContainer}> 
    <Route path="view-1" 
     onEnter={ view1onEnter } 
     onLeave={ view1onLeave } 
     component={ View1 } 
     canNavigate={ false } 
    /> 
    <Route path="view-2" 
     onEnter={ view2onEnter } 
     onLeave={ view2onLeave } 
     component={ View2 } 
     canNavigate={ true } 
    /> 
    ... 
</Route> 

Więc załóżmy, że jestem na #/view-2 i wywołać akcję jak history.push({pathname: '/view-1'});. Ale jak tylko trasa view-1 ma flagę canNavigate={false} - chcę uniemożliwić nawigację i pokazać komunikat bez zmieniania hasha i żadnych innych efektów ubocznych (jak wywoływanie haka onLeave z view-2).

Myślałam o słuchanie history:

history.listenBefore((location, callback) => { 
    //e.g. callback(false) to prevent navigation 
}) 

ale nie mogę dostać instancja trasa sprawdzić canNavigate flagę.
Później odkryłem, że history ma metodę match które faktycznie dostaje następny stan routera w oparciu o dany location:

history.listenBefore((location, callback) => { 
    history.match(location, (error, redirectLocation, nextState) => { 
     const route = _.last(nextState.routes); 
     if (route.canNavigate) { 
      callback(); 
     } else { 
      callback(false); 
     } 
    }); 
}) 

ale problemem jest to, że history.match rozmowy onLeave Zaczep view-2 wewnątrz (które mogą, przykład, wyczyść stan, nawet jeśli użytkownik pozostaje w widoku view-2).

Pytanie: czy jest to możliwe, aby zapobiec nawigację z view-2 bez jakichkolwiek zmian w ogóle w historii/routera i podejmowaniu tej decyzji w oparciu o konfigurację trasy docelowej?

Odpowiedz

1

React nie może zapobiec nawigacji po wywołaniu historii.push.

Powinieneś hermetyzować usługę historii niestandardową, która sprawdzi, czy można nawigować i czy jest to następnie historia połączeń. inaczej uniemożliwi nawigację i utrzyma stan.

+0

Cóż, właściwie to [może] (https://github.com/reactjs/react-router/blob/v2.1.0/docs/guides/ConfirmingNavigation.md). Problem polega na tym, że mam sporo tras i chcę pozbyć się duplikatów czeków. – Kiril

+0

Powielanie oznacza, że ​​nie chcesz sprawdzać stanu, czy nawigacja jest w porządku, ponieważ każda trasa ma już rekwizyty canNavigate? Kolejną rzeczą, czy rekwizyty canNigate są dynamiczne czy statyczne? –

+0

@JohnWilliamDomingo, 'canNavigate' może być dowolne. W moim przypadku - jest to nieruchomość statyczna. I tak, masz rację co do powielania. – Kiril