1. 程式人生 > >react-native之react-navigation使用總結

react-native之react-navigation使用總結

前言

介面Tab導航,跳轉以及title的顯示效果是一款優秀APP非常重要的一部分,門面要做好,才會帶來好的使用者體驗。

目錄

  • 安裝
  • 使用介紹

安裝

npm安裝

npm install --save react-navigation

yarn安裝

yarn add react-navigation

使用介紹

1.navigation有三個預設的navigators:

  • StackNavigator: 用來實現介面間的切換, 新的介面置於棧頂。
  • TabNavigator:實現Tab選單功能。
  • DrawerNavigator: 實現抽屜選單的效果。

2.具體使用

StackNavigator使用:

1.建立StackNavigator

import Tab from './MainTab';

/**
 * 應用根路由
 */
export const RootNavigator = StackNavigator({
    Tab: {screen: Tab},
}, {
    initialRouteName: 'Tab',
    mode: 'card',
    headerMode: 'screen',
    navigationOptions: () => ({
        headerBackTitle: null
, headerTintColor: theme.NAVBAR_TITLE_COLOR, headerStyle: { backgroundColor: theme.NAVBAR_BG_COLOR, borderBottomWidth: 0, elevation: 0, }, }) }); export default class AppWithNavigationState extends Component { render() { return
( <RootNavigator navigation={addNavigationHelpers({ dispatch: this.props.dispatch, state: this.props.nav })} /> ) } }

2.API 定義

StackNavigator(RouteConfigs, StackNavigatorConfig)
RouteConfigs配置:
 Tab: {screen: Tab},第一個Tab是定義的路由名字,第二個是引入的元件。使用this.props.navigation.navigate('路由名'),就可以實現跳轉;
StackNavigatorConfig配置:

路由相關配置:

  1. initialRouteName:預設的初始要跳轉的介面,必須匹配一個已經配置的路由,否則報錯。
  2. initialRouteParams: 初始化路由引數。
  3. navigationOptions: 預設的navifation選項,下面有詳細總結。
  4. paths:路由路徑的配置設定。

視覺化選項:

  1. mode: 定義顯示和介面切換風格
    a. card - Android 和 iOS 標準模式。預設此模式。
    b. modal - IOS介面從底部滑動顯示,Android不支援此屬性
  2. headerMode:定義header如何渲染
    a. float: header漂浮在介面之上,介面切換有個透明度的改變,不會固定在介面上跟著介面走。這個是iOS上常見的模式。
    b.screen:header吸附在介面上,隨著介面的移動而移動,這個是Android上面常用模式。
    c.none:不渲染頭。
  3. cardStyle:對單個的card的風格進行定義。
  4. transitionConfig: 介面切換配置。
    a.transitionProps: 新介面切換屬性配置。
    b.prevTransitionProps: 關閉介面屬性配置。
    c.isModal: 布林值,是否指定以modal的形式切換介面。
  5. onTransitionStart: 開始切換時的回撥。
  6. onTransitionEnd: 結束切換時回撥。
  1. title: 介面標題。
  2. header: 介面的頭佈局,設定為null則隱藏header。
  3. headerTitle: 介面title, 當他是一個元件時,可以接收allowFontScaling, style 和 children屬性。
  4. headerTitleAllowFontScaling: 布林值,是否允許頭字型支援縮放,預設為true。
  5. headerBackTitle: 返回title.iOS 11使用。
  6. headerTruncatedBackTitle:返回,headerBackTitle不適用時使用。
  7. headerRight: 顯示在header右側。
  8. headerLeft: 顯示在header左側。
  9. headerStyle: header的style物件。
  10. headerTitleStyle: title元件物件。
  11. headerBackTitleStyle:backtitle的style物件。
  12. headerTintColor: header的顏色。
  13. headerPressColorAndroid: Android >= 5.0 材質化設計點選漣漪效果。
  14. gesturesEnabled: 布林值,是否支援手勢關閉螢幕,iOS 預設為true,Android預設為false。
  15. gestureResponseDistance: 手勢響應的距離。
    a.horizontal - 水平的距離,預設25。
    b.vertical - 垂直的距離, 預設135。
  16. gestureDirection:重新定義手勢方向,預設正常的方向。
  17. Navigator Props: Navigator屬性。
 render() {
        return (
            <RootNavigator navigation={addNavigationHelpers({
                dispatch: this.props.dispatch,
                state: this.props.nav
            })} />
        )
    }

RootNavigator是StackNavigater元件,navigation是其屬性,這樣我們就可以在子元件中通過this.props.navigation取到navigation屬性。

TabNavigator使用:

1.建立TabNavigator

/**
 * 首頁導航
 * @type {Object}
 */
export default TabNavigator({
    Home: {screen: Home},
    StationPage: {screen: StationPage},
    MessagePage: {screen: MessagePage},
    AccountPage: {screen: AccountPage},
}, {
    initialRouteName: 'StationPage',
    tabBarPosition: 'bottom',
    swipeEnabled: false,
    animationEnabled: false,
    navigationOptions: {
        gesturesEnabled: false,
        headerBackTitle: null,
    },
    tabBarOptions: {
        showIcon: true,
        activeTintColor: theme.TAB_TINT_COLOR_ACTIVE,
        inactiveTintColor: theme.TAB_TINT_COLOR,
        indicatorStyle: {height: 0},
        style: {
            backgroundColor: '#efefef',
            height: px(100),
            paddingTop: 0,
        },
        labelStyle: {
            fontSize: px(24),
            marginTop: 0,
            paddingTop: 0,
        },
    }
});

2.API 定義

TabNavigator(RouteConfigs, TabNavigatorConfig)
RouteConfigs配置:
它是一個從路由名字到路由配置的對映。使用類似StackNavigator。
TabNavigatorConfig配置:
  1. tabBarComponent: Tab bar元件,iOS 預設在下面,Android 預設在上面。
  2. tabBarPosition: Tab bar 的位置,“top” 或者 “bottom”。
  3. swipeEnabled:是否允許tab之間進行切換。
  4. animationEnabled: 是否允許切換時執行動畫。
  5. configureTransition: 配置tab之間切換動畫。
  6. lazy: 控制懶載入機制,是否需要提前載入。
  7. initialLayout: 初始的佈局,包含寬高,可已預防載入遲鈍。
  8. tabBarOptions: tabBar的一些樣式選項。下面有總結。
  9. initialRouteName: 第一個載入的路由名。
  10. order: 對載入路由進行排序。
  11. paths:名字到路由配置的對映,對路由配置進行設定。
  12. backBehavior: 點選返回鍵,是否切換到initialRoute。
tabBarOptions配置:
  1. activeTintColor: 選中tab的圖示和標籤的顏色。
  2. activeBackgroundColor: 選中Tab的背景顏色。(IOS)
  3. inactiveTintColor: 未被選中Tab的圖示和標籤的顏色。
  4. inactiveBackgroundColor: 未被選中的Tab的背景顏色。(IOS)
  5. showLabel:是否顯示對應Tab的標籤,預設顯示。
  6. style: Tab bar的樣式。
  7. labelStyle:Tab標籤的樣式。
  8. tabStyle: Tab的樣式。
  9. allowFontScaling: 標籤字型是否允許縮放。預設true。
  10. showIcon:是否顯示圖片。預設不顯示。(Android)
  11. upperCaseLabel: 是否標籤大寫。預設true。(Android)
  12. pressColor: 點選顏色。(Android >= 5.0 漣漪效果)
  13. pressOpacity:透明度改變。(iOS and Android < 5.0 only)
  14. scrollEnabled: 是否Tab能夠滑動。(Android)
  15. indicatorStyle: Tab 底端指示器風格。(Android)
  16. iconStyle: Tab Icon物件樣式。(Android)
  1. title: 標題。
  2. tabBarVisible: 布林值,tabBar是否可見。
  3. swipeEnabled: 布林值,是否允許在標籤之間進行滑動。
  4. tabBarIcon: tabBar圖片icon。
  5. tabBarLabel:同tabBarOptions.showLabel。
  6. tabBarOnPress: 點選tabBar觸發。
    a.previousScene: { route, index } : 離開時的介面。
    b.scene: { route, index } : 點選的路由,索引。
    c.jumpToIndex: 在切換到下一個介面之前,可以在此方法中處理一些自定義的邏輯。

DrawerNavigator使用:

1.建立DrawerNavigator(官方的例子):

class MyHomeScreen extends React.Component {
  static navigationOptions = {
    drawerLabel: 'Home',
    drawerIcon: ({ tintColor }) => (
      <Image
        source={require('./chats-icon.png')}
        style={[styles.icon, {tintColor: tintColor}]}
      />
    ),
  };

  render() {
    return (
      <Button
        onPress={() => this.props.navigation.navigate('Notifications')}
        title="Go to notifications"
      />
    );
  }
}

class MyNotificationsScreen extends React.Component {
  static navigationOptions = {
    drawerLabel: 'Notifications',
    drawerIcon: ({ tintColor }) => (
      <Image
        source={require('./notif-icon.png')}
        style={[styles.icon, {tintColor: tintColor}]}
      />
    ),
  };

  render() {
    return (
      <Button
        onPress={() => this.props.navigation.goBack()}
        title="Go back home"
      />
    );
  }
}

const styles = StyleSheet.create({
  icon: {
    width: 24,
    height: 24,
  },
});

const MyApp = DrawerNavigator({
  Home: {
    screen: MyHomeScreen,
  },
  Notifications: {
    screen: MyNotificationsScreen,
  },
});

2.API定義:

DrawerNavigator(RouteConfigs, DrawerNavigatorConfig)
RouteConfigs配置:
同StackNavigator配置。
DrawerNavigatorConfig配置
  1. drawerWidth: 抽屜的寬度或者是函式返回值。
  2. drawerPosition: 抽屜的位置,left左側,right右側。
  3. contentComponent: 用來渲染抽屜內容的元件。下面詳解。
  4. contentOptions: 配置抽屜的內容。下面詳解。
  5. useNativeAnimations: 使用本地動畫。預設true。
  6. drawerBackgroundColor:抽屜的背景顏色。預設白色。
  7. initialRouteName: 初始化路由名。
  8. order。抽屜item顯示的順序。
  9. paths:路由名字到配置的對映。
  10. backBehavior: 返回按鈕是否返回初始路由。yes到初始路由,否則none。

自定義contentcomponent:

import { DrawerItems, SafeAreaView } from 'react-navigation';

const CustomDrawerContentComponent = (props) => (
  <ScrollView>
    <SafeAreaView style={styles.container} forceInset={{ top: 'always', horizontal: 'never' }}>
      <DrawerItems {...props} />
    </SafeAreaView>
  </ScrollView>
);

const styles = StyleSheet.create({
  container: {
    flex: 1,
  },
});

contentOptions配置:

  1. items: 可以修改或者重寫路由。
  2. activeItemKey: 啟用路由對應的key。
  3. activeTintColor: 選中標籤對應的標籤和icon的顏色。
  4. activeBackgroundColor: 選中標籤對應的顏色。
  5. inactiveTintColor:未選中對應的標籤和icon對應的顏色。
  6. inactiveBackgroundColor:未選中對應的北京顏色。
  7. onItemPress(route): 當item被點選時,呼叫的函式。
  8. itemsContainerStyle:對應section部分的樣式。
  9. itemStyle: 對應item的樣式。
  10. labelStyle: 對應label的樣式。
  11. iconContainerStyle:重寫view的icon Container樣式。
  1. title: 標題。
  2. drawerLabel: 字串,元件或者函式。標籤顯示在側邊欄,沒有定義title代替。
  3. drawerIcon:元件或者函式。圖片顯示在側邊欄。
  4. drawerLockMode: 指定抽屜的鎖模式。
    a. unlocked: 預設。響應手勢的觸控開關。
    b. locked-closed:抽屜保持關閉的狀態,不響應手勢。
    c. locked-open: 抽屜一直開著,不響應手勢。

    同StackNavigator。