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?
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
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? –
@JohnWilliamDomingo, 'canNavigate' może być dowolne. W moim przypadku - jest to nieruchomość statyczna. I tak, masz rację co do powielania. – Kiril