美文网首页
React Navigation 学习笔记

React Navigation 学习笔记

作者: baby熊_熊姐 | 来源:发表于2017-08-10 20:26 被阅读331次

    Screen

    表示一个屏幕界面

    class ChatScreen extends React.Component {
      static navigationOptions = {
        title: 'Chat with Lucy',
      };
      render() {
        return (
          <View>
            <Text>Chat with Lucy</Text>
          </View>
        );
      }
    }
    

    Screen Navigation Options

    • 静态定义方法。写法同上。
    • 动态定义方法。
    static navigationOptions = ({ navigation, screenProps, navigationOptions }) => ({ 
       title: navigation.state.params.name,
       headerRight: <Button color={screenProps.tintColor} />
    })
    

    API Definition

    {
       title,
       header, // null 时不展示屏幕的头部
       headerTitle,
       headerBackTitle,
       headerTruncatedBackTitle,
       headerRight,
       headerLeft,
       headerStyle,
       headerTitleStyle,
       headerBackTitleStyle,
       headerPressColorAndroid,
       getturesEnabled
    }
    

    Navigator

    将多个屏幕层叠起来,定义各个屏幕界面之间的逻辑

    StackNavigator

    从一个屏幕跳转到下一个屏幕,定义多个相互关联的屏幕。

    API Definition

    StackNavigator(RouteConfigs, StackNavigatorConfig)
    
    // RouteConfig
    RouteConfigs: {
       screen: 'Screen1' // component,
       path: '/', // deep linking 或 web 下会用到
       navigationOptions: ({navigation}) => ({title: navigation.state.params.name}) // 重写Screen下的定义
    }
    
    StackNavigatorConfig: {
      inittialRouteName,
      initialRouteParams,
      navigationOptions,
      paths,
      mode,
      headerMode,
      cardStyle,
      transitionConfig,
      onTransitionStart,
      onTransitionEnd
    }
    

    举个栗子:

    const ModalStack = StackNavigator({
      Home: {
        screen: MyHomeScreen,
        path: '/' 
      },
      Profile: {
        path: 'people/:name',
        screen: MyProfileScreen,
      },
    });
    

    TabNavigator

    关联多个 tab 的 Screen

    const MyApp = TabNavigator({
      Home: {
        screen: MyHomeScreen,
      },
      Notifications: {
        screen: MyNotificationsScreen,
      },
    }, {
      tabBarOptions: {
        activeTintColor: '#e91e63',
      },
    });
    

    API Definition

    TabNavigator(RouteConfigs, TabNavigatorConfig)
    
    // RouteConfigs 同 StackNavigator
    
    TabNavigatorConfig: {
       tabBarComponent,
       tabBarPosition, // top 或 bottom
       swipeEnabled,
       animationEnabled,
       lazy,
       tabBarOptions: {
          avtiveTintColor,
          activeBackgroundColor,
          inactiveTintColor,
          inactiveBackgroundColor,
          showLabel,
          style,    
          labelStyle,
          tabStyle
       },
       initialRouteName,
       order, 
       paths,
       backBehavior
    }
    

    举个栗子

    const MyApp = TabNavigator({
      Home: {
        screen: MyHomeScreen,
      },
      Notifications: {
        screen: MyNotificationsScreen,
      },
    }, {
      tabBarOptions: {
        activeTintColor: '#e91e63',
      },
    });
    

    DrawerNavigator

    定义一个抽屉列表

    API Definition

    DrawerNavigator(RouteConfigs, DrawerNavigatorConfig)
    
    // RouteConfig 同 StackNavigator
    
    DrawerNavigatorConfig: {
       drawerWidth,
       drawerPosition,
       contentComponent,
       contentOptions: {
          
       }
    }
    

    举个栗子

    const MyApp = DrawerNavigator(
      {
        First: {
          path: '/',
          screen: FirstScreen,
        },
        Second: {
          path: '/sent',
          screen: SecondScreen,
        },
      },
      {
        initialRouteName: 'First',
        drawerPosition: 'left',
        drawerWidth: 200,
        contentOptions: {
          activeTintColor: 'red'
        }
      }
    )
    

    Navigator Props

    将StackNavigator 换成 TabNavigator 或 DrawerNavigator 同样成立
    const SomeStack = StackNavigator({
      // config
    });
    
    <SomeStack
      screenProps={/* this prop will get passed to the screen components as this.props.screenProps */}
    />
    
    

    Screen Navigation Prop

    每个 Screen 都会接收到 一个 navigation Props, 如下:

    this.props.navigation : {
       navigate: {
          routeName,
          params,
          action
       }, // 导航到其他 Screen
       state: {
          index, 
          routes: [{
              routeName,
              key,
              params
          }]
     },// Screen 当前的 state 或 route
       setParams, // 改变路由中的参数
       goBack, // 返回到上一屏
       dispatch // 向路由发出 Action
    }
    
    navigator 也有 navigation 属性,但可能只有 state, 和 dispatch 两个属性,
    
    

    Navigation Actions

    触发路由改变

    拥有方法如下:

    • Navigate:导航到新路由
    • Reset: 替换当前的 State
    • Back: 返回之前的 State
    • Set Params: 设置给定路由的参数
    • Init:如果 state 没定义,则初始化第一个 state

    栗子

    NavigationActions.back()
    NavigationActions.navigate({ routeName: 'Login' }),
    

    通常返回结果被 dispatch 调用

    this.props.navigation.dispatch(NavigationActions.navigate({ routeName: 'Login' }))
    

    Custom Navigation

    const { routes, index } = state;
    
    // 根据当前状态找到 Component
    const Component = MyRouter.getComponentForState(state);
    
    // 根据 State 找到 active child Screen
    let childNavigation = {dispatch, state: routes[index]}
    
    // 使用addNavigationHelpers 来增加导航路径,方便使用 navigator 调用
    childNavigation = addNavigationHelpers(childNavigation)
    
    <Component navigation={childNavigation} />
    

    API for building custom navigators

    createNavigator

    将 router 和 navigation view 绑定在一起, 使得该视图层拥有一个 router 的属性

    等同于

    const MyApp = ({ navigation }) => (
       <MyView router={MyRouter} navigation={navigation} />
    MyApp.router = MyRouter
    )
    

    addNavigationHelpers

    用来创建 actions ,并被 dispatch 调用

    createNavigationContainer

    使得导航行为就像是顶级的导航,用于管理 state 并整合 app-level 级别的功能, 而不需要将 navigation 通过 props传递给最外层

    const CustomTabs = createNavigationContainer(
      createNavigator(CustomTabRouter)(CustomTabView)
    );
    

    Routers

    Custom Router API

    getStateForAction(action, state)
    当发生 dispatch 或 navigaiton.navigate 时被调用,通常返回一个新的 state

    {
      index: 1,
      routes: [
        { key: 'A', routeName: 'Foo' },
        { key: 'B', routeName: 'Bar' },
      ],
    }
    

    getComponentForRouteName(routeName)
    根据 routeName 返回对应的 component

    router.getComponentForRouteName('Foo')
    

    getComponentForState(state)
    返回当前的 component

    getActionsForPathAndParams(path, params)
    返回一个 action, 当再次回到该路由下时会被用到

    getScreenOptions(navigation, screenProps)

    const screenNavigation = addNavigationhelpers({
       state: navigation.state.routes[navigation.state.index],
       dispatch: navigation.dispatch
    })
    
    const options = this.props.router.getScreenOptions(
       screenNavigation,
       {}
    )
    
    const title = options.title
    

    StackRouter

    管理 navigation stack

    const MyApp = StackRouter({
       Home: {
         screen: HomeScreen,
         path,
         getScreen // Set a lazy getter for a screen
       },
       Profile: {
         screen: ProfileScreen
       }, {
        initialRouteName: 'Home',
        initialRouteParams,
        paths
       }
    })
    

    TabRouter

    const MyApp = TabRouter({
      Home: { screen: HomeScreen },
      Settings: { screen: SettingsScreen },
    }, {
      initialRouteName: 'Home',
      order,
      paths,
      backBehavior
    })
    

    Views

    Built in Views

    • CardStack
      • Card
      • Header
    • Tabs
    • Drawer

    相关文章

      网友评论

          本文标题:React Navigation 学习笔记

          本文链接:https://www.haomeiwen.com/subject/uofkrxtx.html