react-native-route is an extreme performance react-native navigation library, It uses native animations and gestures, so it can give you the best performance experience as native apps
- Support the same interface as react-navigation, so you can switch between them
- Support global navigation variables, so navigation can be used anywhere
- Support customizable modal pop-up windows, pop-up windows also support navigation
- Support Component life cycle, no need to observe, directly overload the life cycle method
- Have the Route component, direct navigation after clicking no longer requires thread asynchronous communication
- Have the NativigationBar component, which can be directly inherited or used globally
- Support global observation of navigation events, more convenient log statistics
yarn add 'https://github.com/hellohublot/react-native-route.git'
In order to be compatible with the diversity of startup navigation, and the performance considerations of UITabBarItem click events, we put all startups in the native
You can use native NavigationController and UITabBarController, and FDFullscreenPopGesture has been integrated, We use moduleName to preload bundle
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
...
[HTRouteBridgeManager loadBridgeWithURL:[self sourceURLForBridge:nil] moduleName:@"ReactNativeDemo" launchOptions:launchOptions];
...
NSArray *keyValueList = @[
@{ titleKey: @"Home", imageKey: @"tabbar_home", selectedImageKey: @"tabbar_home_selected", componentKey: @"Home" },
@{ titleKey: @"Mine", imageKey: @"tabbar_mine", selectedImageKey: @"tabbar_mine_selected", componentKey: @"Mine" },
];
[keyValueList enumerateObjectsUsingBlock:^(NSDictionary *dictionary, NSUInteger index, BOOL * _Nonnull stop) {
HTRouteController *routeController = [HTRouteController controllerWithComponentName:dictionary[componentKey] componentRouteOptionList:@{@"id": [NSString stringWithFormat:@"%ld", index]}];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:routeController];
navigationController.fd_viewControllerBasedNavigationBarAppearanceEnabled = false;
...
}];
...
return YES;
}
We use moduleName to preload bundle
public void onCreate() {
super.onCreate();
...
HTRouteGlobal.application = this;
HTRouteGlobal.moduleName = "ReactNativeDemo";
getReactNativeHost().getReactInstanceManager().createReactContextInBackground();
}
We handle the back button in invokeDefaultOnBackPressed
private HTRouteTabBarController tabBarController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
finish();
return;
}
setReactNativeContentView();
}
private void setReactNativeContentView() {
HTRouteGlobal.activity = this;
this.tabBarController = new HTRouteTabBarController() {
private Map createComponentRouteOption() {
final int count = modelList.size();
Map<String, Serializable> componentRouteOption = new HashMap() {{
put("id", count);
}};
return componentRouteOption;
}
@Override
public void initDataSource() {
modelList.clear();
modelList.add(
new HTRouteTabBarModel("Home", R.mipmap.tabbar_home, R.mipmap.tabbar_home_selected,
new HTRouteNavigationController(new HTRouteController("Home", createComponentRouteOption())))
);
...
}
};
setContentView(this.tabBarController.getView());
}
@Override
public void invokeDefaultOnBackPressed() {
HTRouteNavigationController selectedFragment = (HTRouteNavigationController) tabBarController.findSelectedFragment();
if (selectedFragment.childControllerList.size() > 1) {
selectedFragment.popViewController(true);
} else {
moveTaskToBack(true);
}
}
We can handle the parameters of Component.Static by ourselves
import { HTRouteManager, HTRouteComponent, HTRouteView, HTNavigationBar } from 'react-native-route'
HTRouteManager.register({
'Home': () => require('~/page/Home').default,
'Mine': () => require('~/page/Mine').default,
})
HTRouteManager.defaultRouteNavigationRender = (props) => {
const readComponentOptionsFromProps = (props) => {
...
}
let navigationOptions = readComponentOptionsFromProps(props)
// header
if ((navigationOptions.hasOwnProperty('header') && navigationOptions.header == null) || navigationOptions.headerShown == false) {
return null
}
// header item
let leftItemList = [
<HTRouteView style={{ paddingRight: 30, height: '100%', justifyContent: 'center' }}
routeData={props.navigation.createRouteData('pop')}
>
<Image source={require('~/img/back_white.png')} />
</HTRouteView>
]
...
return (
<HTNavigationBar
backgroundColor={'white'}
titleStyle={{ color: 'white', fontSize: 20 }}
leftItemList={leftItemList}
{...navigationOptions}
/>
)
}
export default class App extends Component {
render() {
return (
<HTRouteComponent
{ ...this.props }
/>
)
}
}
hellohublot, [email protected]