react-navigation 常用方法总结

1,创建底部选项卡 createBottomTabNavigator

import React from "react";
import { StyleSheet, Image } from "react-native";
import {setSpText, scaleSizeW} from '../utils/util';
import Home from '../page/home/home';
import Task from '../page/task/task';
import Mine from '../page/mine/mine';
import { createBottomTabNavigator, BottomTabBar } from 'react-navigation';
const TabBarComponent = props => <BottomTabBar {...props} />;

const TabNav = createBottomTabNavigator(
  {
    Home: {
      screen: Home,
      navigationOptions: {
        showLabel: true,
        tabBarLabel: "首页",
        tabBarIcon: ({ focused, tintColor }) => (
          <Image
            source={
              focused
                ? require("../assets/image/tabIcon/homepage-on.png")
                : require("../assets/image/tabIcon/homepage.png")
            }
            resizeMode="contain"
            style={styles.tabBarIconStyle}
          />
        )
      }
    },
    Task: {
      screen: Task,
      navigationOptions: {
        showLabel: true,
        tabBarLabel: '任务',
        tabBarIcon: ({focused, tintColor}) => (
          <Image
            source={
              focused
                ? require('../assets/image/tabIcon/task-on.png')
                : require('../assets/image/tabIcon/task.png')
            }
            resizeMode="contain"
            style={styles.tabBarIconStyle}
          />
        ),
      },
    },
    MyInfo: {
      screen: Mine,
      navigationOptions: {
        showLabel: true,
        tabBarLabel: '我的',
        tabBarIcon: ({focused, tintColor}) => (
          <Image
            source={
              focused
                ? require('../assets/image/tabIcon/myhome-on.png')
                : require('../assets/image/tabIcon/myhome.png')
            }
            resizeMode="contain"
            style={styles.tabBarIconStyle}
          />
        )
      }
    }
  },
  {
    tabBarOptions: {
      // 当前选中的tab bar的文本颜色和图标颜色
      activeTintColor: '#FF6E1D',
      // 当前未选中的tab bar的文本颜色和图标颜色
      inactiveTintColor: "#999999",
      // 是否显示tab bar的图标,默认是false
      showIcon: true,
      // showLabel - 是否显示tab bar的文本,默认是true
      showLabel: true,
      // 是否将文本转换为大小,默认是true
      upperCaseLabel: false,
      // material design中的波纹颜色(仅支持Android >= 5.0)
      pressColor: "#788493",
      // 按下tab bar时的不透明度(仅支持iOS和Android < 5.0).
      pressOpacity: 0.8,
      // tab bar的样式
      style: {
        height: scaleSizeW(98),
        backgroundColor: "#fff",
        paddingTop: scaleSizeW(10),
        paddingBottom: scaleSizeW(10),
        borderTopColor: "#ededed",
        elevation: 5
      },
      // tab bar的文本样式
      labelStyle: {
        fontSize: setSpText(20),
        marginTop: scaleSizeW(3),
        width: "100%",
        marginLeft: 0
      },
      tabStyle: {
        height: scaleSizeW(78),
        flexDirection: "column",
        alignItems: "center",
        justifyContent: "center"
      },
      // tab 页指示符的样式 (tab页下面的一条线).
      indicatorStyle: { height: 0 }
    },
    // tab bar的位置, 可选值: 'top' or 'bottom'
    tabBarPosition: "bottom",
    // 是否允许滑动切换tab页
    swipeEnabled: false,
    // 是否在切换tab页时使用动画
    animationEnabled: false,
    // 是否懒加载
    lazy: true,
    // 返回按钮是否会导致tab切换到初始tab页? 如果是,则设置为initialRoute,否则为none。 缺省为initialRoute。
    backBehavior: "none",
    initialRouteName: "Home"
  }
);

const styles = StyleSheet.create({
  tabBarIconStyle: {
    width: scaleSizeW(40),
    height: scaleSizeW(40)
  },
  icon: {
    width: scaleSizeW(100),
    height: scaleSizeW(100),
    marginTop: scaleSizeW(-60),
    borderRadius: scaleSizeW(50)
  }
});

export default TabNav;

2,页面的堆栈路由 createStackNavigator

  const Root = createStackNavigator(
  {
    Main: createRouter(TabNav, 'Main'), // 挂载1中的底部选项卡
    Detial: createRouter(Detail, '详情') // 其他页面
  },
    {
    initialRouteName: 'Main', // 默认路由
    transitionConfig: () => ({
      screenInterpolator: StackViewStyleInterpolator.forHorizontal,
    }),
  }function createRouter(screen, title, path) {
   // 由于我们使用了一个统一的外层layout组件,不在这里设置页面的头部信息
  return {
    screen,
    path,
    navigationOptions: ({navigation}) => ({
      title,
      tabBarVisible: true,
      header: null,
    }),
  };
}

直接把该组件挂在根组件即可
3,页面跳转
一般的跳转 this.props.navigation.navigate(screenName)
同一个页面的跳转/刷新,因为堆栈路由的原因navigate,会在堆栈中找到screenName,Eg:详情+列表页,详情不刷新,使用push
this.props.navigation.push(screenName)
4,页面传参和获取参数
传参: this.props.navigation.navigate(‘RouteName’, { id:1 } )
获取参数:this.props.navigation.state.params.id
或者this.props.navigation.getParam(‘id’)
5,路由的生命周期
React Navigation 将事件发送到订阅了它们的页面组件: 有4个不同的事件可供订阅:willFocus、willBlur、didFocus 和 didBlur
使用eg:

  import { NavigationEvents } from "react-navigation";
  ...
          <NavigationEvents
            onDidFocus={this.init}
            onWillBlur={() => {
              this.reset(true);
            }}
        />

*这个生命周期可以有效的解决react的生命周期,在选项卡页面(BottomTabNavigator)等,不能按预期执行的问题,非常好用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Native 中,可以使用第三方库来实现路由拦截。一个常用的库是 React Navigation,它提供了强大的导航和路由管理功能。 要实现路由拦截,可以使用 React Navigation 提供的导航守卫功能。导航守卫可以在路由变化前或后执行自定义的逻辑。 以下是一个简单的示例,演示如何在 React Native 中使用 React Navigation 实现路由拦截: 1. 首先,确保已经安装了 React Navigation: ``` npm install @react-navigation/native ``` 2. 安装所需的导航器(例如 Stack Navigator): ``` npm install @react-navigation/stack ``` 3. 创建一个名为 `NavigationService.js` 的新文件,用于导航拦截逻辑: ```javascript import { NavigationActions } from '@react-navigation/compat'; let navigator; function setTopLevelNavigator(navigatorRef) { navigator = navigatorRef; } function navigate(routeName, params) { navigator.dispatch( NavigationActions.navigate({ routeName, params, }) ); } // 添加其他需要的导航方法 export default { navigate, setTopLevelNavigator, }; ``` 4. 在根组件中设置导航器并引用 `NavigationService.js`: ```javascript import { NavigationContainer } from '@react-navigation/native'; import { createStackNavigator } from '@react-navigation/stack'; import NavigationService from './NavigationService'; const Stack = createStackNavigator(); function App() { return ( <NavigationContainer ref={navigatorRef => { NavigationService.setTopLevelNavigator(navigatorRef); }}> <Stack.Navigator> {/* 添加其他屏幕 */} </Stack.Navigator> </NavigationContainer> ); } export default App; ``` 5. 在需要拦截的组件中使用 `NavigationService.js`: ```javascript import NavigationService from './NavigationService'; // 在需要拦截的地方调用 `NavigationService.navigate` 方法 NavigationService.navigate('ScreenName'); ``` 通过这种方式,你可以在路由变化前后执行自定义的逻辑,例如验证用户权限、处理特定的跳转逻辑等。需要注意的是,这只是一个简单的示例,你可以根据具体的需求进行定制和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值