Из вашего вопроса я понимаю, что либо вы хотите: -
- переходить из-за пределов компонентов
- переходить из компонентов, которые не имеют навигационной опоры.
Для этого я попробовал 2 решения, и оба они работают очень хорошо, хотя я опирался на второе.
Первое решение
Использование с навигацией из react-navigation
упаковки.Если ваши компоненты глубоко вложены, у них не будет навигационной поддержки, если вы не укажете их вручную или не поместите их в контекст; передача навигационной поддержки становится настоящей болью.Поэтому вместо этого используйте withNavigation , и ваш компонент будет иметь навигационную опору.
import {withNavigation} from "react-navigation";
const Component = ({navigation}) => {
const onPress = () => {
navigation.navigate(//ROUTE_NAME//)
}
return (
<TouchableOpacity onPress={onPress}>
<Text>Navigate</Text>
</TouchableOpacity>
)
}
export default withNavigation(Component);
Второе решение
Создайте вспомогательный скрипт и используйте его.
"use strict";
import React from "react";
import {NavigationActions} from "react-navigation";
let _container; // eslint-disable-line
export const navigation = {
mapProps: (SomeComponent) => {
return class extends React.Component {
static navigationOptions = SomeComponent.navigationOptions; // better use hoist-non-react-statics
render () {
const {navigation: {state: {params}}} = this.props;
return <SomeComponent {...params} {...this.props} />;
}
}
},
setContainer: (container) => {
_container = container;
},
reset: (routeName, params) => {
_container.dispatch(
NavigationActions.reset({
index: 0,
actions: [
NavigationActions.navigate({
type: "Navigation/NAVIGATE",
routeName,
params
})
]
})
);
},
goBack: () => {
_container.dispatch(NavigationActions.back());
},
navigate: (routeName, params) => {
_container.dispatch(
NavigationActions.navigate({
type: "Navigation/NAVIGATE",
routeName,
params
})
);
},
navigateDeep: (actions) => {
_container.dispatch(
actions.reduceRight(
(prevAction, action) =>
NavigationActions.navigate({
type: "Navigation/NAVIGATE",
routeName: action.routeName,
params: action.params,
action: prevAction
}),
undefined
)
);
},
getCurrentRoute: () => {
if (!_container || !_container.state.nav) {
return null;
}
return _container.state.nav.routes[_container.state.nav.index] || null;
}
};
В вашем родительском компоненте при монтировании вызова навигации выполните следующее: -
"use strict";
import React from "react";
import App from "./routes";
import {navigation} from "utils";
class Setup extends React.Component {
render () {
return (
<App
ref={navigatorRef => {
navigation.setContainer(navigatorRef);
}}
/>
);
}
}
export default App;
Теперь в ваших компонентах вы можете напрямую использовать помощники из самого этого сценария, и навигация будет доступна глобально.сейчас.
import {navigate} from "utils/navigation";
Для более подробной информации вы можете это поток