react-native-navigation步步深入之導航篇

接著上篇react-native-navigation步步深入之Android、ios配置篇,該篇會一步步開始構建一個app的主要架構,一個tab導航。

修改入口文件

找到項目根目錄下的index.android.js或者ios平臺對應的index.ios.js,修改里面的代碼,在react-native(0.49)之前的版本,所有的示例代碼都是直接寫在index文件里面的,清空入口文件的所有內容,改成如下:
index.android.js

import { AppRegistry } from 'react-native';
import App from './App';

AppRegistry.registerComponent('navigation', () => App);

提示:但是在0.49之后的版本,默認把android和ios的入口都寫到了一個index.js里面,而且里面已經寫好了如下代碼,就無需做任何修改,但是0.49版本之后的版本,我們需要把index.js復制兩份,分別命名為index.android.js和index.ios.js。因為react-native-navigation還沒有及時更新過來,還是默認從index.android.js和index.ios.js打包的。

編輯App.js

同樣,不同的版本有些許區別,0.49之前的版本需要在跟目錄創建App.js,而0.49之后的版本默認就存在,并且0.49之前版本index.android.js和index.ios.js中的代碼在這里進行了綜合。清空App.js,添加如下代碼:

import { Navigation } from 'react-native-navigation';
import { registerScreens } from './src/screens';
registerScreens();
Navigation.startTabBasedApp({
  tabs: [
    {
      label: '首頁',
      screen: 'app.HomeScreen', // this is a registered name for a screen
      icon: require('./src/assets/images/nav1.png'),
      selectedIcon: require('./src/assets/images/nav1_active.png'), // iOS only
      title: '首頁'
    },
    {
      label: '客戶管理',
      screen: 'app.OfferScreen', // this is a registered name for a screen
      icon: require('./src/assets/images/nav2.png'),
      selectedIcon: require('./src/assets/images/nav2_active.png'), // iOS only
      title: '客戶管理'
    },
    {
      label: '車險報價',
      screen: 'app.CustomerScreen', // this is a registered name for a screen
      icon: require('./src/assets/images/nav3.png'),
      selectedIcon: require('./src/assets/images/nav3_active.png'), // iOS only
      title: '車險報價'
    },
    {
      label: '我的',
      screen: 'app.MeScreen',
      icon: require('./src/assets/images/nav4.png'),
      selectedIcon: require('./src/assets/images/nav4_active.png'), // iOS only
      title: '我的'
    }
  ]
});

從以上代碼來看,我們從src/screens/index.js中引入了一個函數(registerScreens),并且開始就執行了。接下來便是啟動一個tab導航,下面有四個頁面,這四個頁面就是一般的rn頁面,接下來就開始創建所需的文件。

注冊所有的頁面組件

在根目錄中新建目錄src,并且新建目錄screens,新建index.js,具體代碼如下:

import { Navigation } from 'react-native-navigation';

import HomeScreen from './HomeScreen';
import MeScreen from './MeScreen';
import OfferScreen from './OfferScreen';
import CustomerScreen from './CustomerScreen';

// register all screens of the app (including internal ones)
export function registerScreens() {
  Navigation.registerComponent('app.HomeScreen', () => HomeScreen);
  Navigation.registerComponent('app.MeScreen', () => MeScreen);
  Navigation.registerComponent('app.OfferScreen', () => OfferScreen);
  Navigation.registerComponent('app.CustomerScreen', () => CustomerScreen);
}

這個文件便是引入所有的頁面組件,并且在一個函數中注冊所有的頁面組件,供App.js中使用,當然這里注冊的頁面組件可以在app中任意地方使用,包括后面的頁面跳轉modal等等,我們都需要用到,具體用法后面介紹。
不過有代碼潔癖的看到這樣的代碼總覺得不爽,這還只是四個tab頁,如果一個app有幾十上百個頁面,我這里豈不是要copy幾十上百遍,這里先放著,后面再進行優化,接下來繼續創建app所需的四個tab頁的組件。

創建tab頁組件

在src/screens目錄中創建如下四個組件,基本上都可以根據如下的結構進行修改,只是改下里面的class名稱和內容罷了。
HomeScreen.js

import React, {Component} from 'react';
import {
  View,
  Text
} from 'react-native';
export default class HomeScreen extends Component {
  render () {
    return (
      <View>
        <Text>首頁</Text>
      </View>
    )
  }
}

CustomerScreen.js

import React, {Component} from 'react';
import {
  View,
  Text
} from 'react-native';
export default class CustomerScreenextends Component {
  render () {
    return (
      <View>
        <Text>客戶管理</Text>
      </View>
    )
  }
}

OfferScreen.js

import React, {Component} from 'react';
import {
  View,
  Text
} from 'react-native';
export default class OfferScreenextends Component {
  render () {
    return (
      <View>
![Uploading Video_2017-10-18_152100_528946.gif . . .]

        <Text>車險報價</Text>
      </View>
    )
  }
}

MeScreen.js

import React, {Component} from 'react';
import {
  View,
  Text
} from 'react-native';
export default class MeScreen extends Component {
  render () {
    return (
      <View>
        <Text>我的</Text>
      </View>
    )
  }
}

接下來,重新運行項目,便可以看到如下的app

示例截圖

現在,一個完整的項目總算成功的跑起來了,接下來我們就來優化下src/screens/index.js中的代碼,最終優化后代碼如下
src/screens/index.js

import { Navigation } from 'react-native-navigation';
export function registerScreens(tag, components) {
  components.map((item, index) => {
    Navigation.registerComponent(tag + '.' + item.name, () => item)
  })
}

App.js

import { Navigation } from 'react-native-navigation';
import { registerScreens } from './src/screens';

import HomeScreen from './src/screens/HomeScreen';
import MeScreen from './src/screens/MeScreen';
import OfferScreen from './src/screens/OfferScreen';
import CustomerScreen from './src/screens/CustomerScreen';

const components = [
  HomeScreen,
  MeScreen,
  OfferScreen,
  CustomerScreen
];

registerScreens('app', components);

Navigation.startTabBasedApp({
  tabs: [
    {
      label: '首頁',
      screen: 'app.HomeScreen', // this is a registered name for a screen
      icon: require('./src/assets/images/nav1.png'),
      selectedIcon: require('./src/assets/images/nav1_active.png'), // iOS only
      title: '首頁'
    },
    {
      label: '客戶管理',
      screen: 'app.OfferScreen', // this is a registered name for a screen
      icon: require('./src/assets/images/nav2.png'),
      selectedIcon: require('./src/assets/images/nav2_active.png'), // iOS only
      title: '客戶管理'
    },
    {
      label: '車險報價',
      screen: 'app.CustomerScreen', // this is a registered name for a screen
      icon: require('./src/assets/images/nav3.png'),
      selectedIcon: require('./src/assets/images/nav3_active.png'), // iOS only
      title: '車險報價'
    },
    {
      label: '我的',
      screen: 'app.MeScreen',
      icon: require('./src/assets/images/nav4.png'),
      selectedIcon: require('./src/assets/images/nav4_active.png'), // iOS only
      title: '我的'
    }
  ]
});

這樣,我們把所有的組件引用全部放到App.js里面,src/screens/index.js只有一個注冊組件的函數,接收兩個參數,一個是注冊組件的名稱前綴(可要可不要),一個就是頁面組件的數組。
這僅僅是小編的方法,當然優化代碼還有很多種,相信每個人都有不同的見解,哪一種最擅長,最習慣就用哪一種。
到此為止,用react-native-navigation正式跑起來了一個項目!接下來的文章將會繼續介紹react-native-navigation的配置以及頁面跳轉啥的,總不能所有的app都是這吊樣,總要根據設計圖做界面調整的,期待下一篇文章繼續介紹!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,269評論 25 708
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,229評論 4 61
  • 我認識的一位小姐L,和我一般大,十幾歲就進入社會,很成熟,機靈。人也長得特別漂亮,無論做什么干什么她都會讓你特別舒...
    畫布坊閱讀 171評論 2 2
  • 文/綠駿馬 星期天,一個讓人精神放松的日子,觀看了紀錄片《追逐珊瑚》。 抱著欣賞與好奇的心走進那片蔚藍色的海,海底...
    綠駿馬sja閱讀 599評論 0 2
  • 當黎明的曙光喚醒沉睡的酣眠,作為housewife每天重復著相同的事情。 這是我對早餐的態度,也是我對待生活...
    A惟楚有材閱讀 558評論 2 1