react-native-navigation步步深入之導(dǎo)航篇

接著上篇react-native-navigation步步深入之Android兼蕊、ios配置篇集侯,該篇會(huì)一步步開始構(gòu)建一個(gè)app的主要架構(gòu)养筒,一個(gè)tab導(dǎo)航砌函。

修改入口文件

找到項(xiàng)目根目錄下的index.android.js或者ios平臺(tái)對(duì)應(yīng)的index.ios.js斩披,修改里面的代碼,在react-native(0.49)之前的版本讹俊,所有的示例代碼都是直接寫在index文件里面的垦沉,清空入口文件的所有內(nèi)容,改成如下:
index.android.js

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

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

提示:但是在0.49之后的版本仍劈,默認(rèn)把a(bǔ)ndroid和ios的入口都寫到了一個(gè)index.js里面厕倍,而且里面已經(jīng)寫好了如下代碼,就無需做任何修改贩疙,但是0.49版本之后的版本讹弯,我們需要把index.js復(fù)制兩份,分別命名為index.android.js和index.ios.js这溅。因?yàn)閞eact-native-navigation還沒有及時(shí)更新過來组民,還是默認(rèn)從index.android.js和index.ios.js打包的。

編輯App.js

同樣悲靴,不同的版本有些許區(qū)別臭胜,0.49之前的版本需要在跟目錄創(chuàng)建App.js,而0.49之后的版本默認(rèn)就存在,并且0.49之前版本index.android.js和index.ios.js中的代碼在這里進(jìn)行了綜合耸三。清空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: '車險(xiǎn)報(bào)價(jià)',
      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: '車險(xiǎn)報(bào)價(jià)'
    },
    {
      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中引入了一個(gè)函數(shù)(registerScreens)仪壮,并且開始就執(zhí)行了憨颠。接下來便是啟動(dòng)一個(gè)tab導(dǎo)航,下面有四個(gè)頁面睛驳,這四個(gè)頁面就是一般的rn頁面烙心,接下來就開始創(chuàng)建所需的文件。

注冊(cè)所有的頁面組件

在根目錄中新建目錄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);
}

這個(gè)文件便是引入所有的頁面組件蹬跃,并且在一個(gè)函數(shù)中注冊(cè)所有的頁面組件匙瘪,供App.js中使用,當(dāng)然這里注冊(cè)的頁面組件可以在app中任意地方使用蝶缀,包括后面的頁面跳轉(zhuǎn)modal等等丹喻,我們都需要用到,具體用法后面介紹翁都。
不過有代碼潔癖的看到這樣的代碼總覺得不爽碍论,這還只是四個(gè)tab頁,如果一個(gè)app有幾十上百個(gè)頁面柄慰,我這里豈不是要copy幾十上百遍鳍悠,這里先放著,后面再進(jìn)行優(yōu)化坐搔,接下來繼續(xù)創(chuàng)建app所需的四個(gè)tab頁的組件藏研。

創(chuàng)建tab頁組件

在src/screens目錄中創(chuàng)建如下四個(gè)組件,基本上都可以根據(jù)如下的結(jié)構(gòu)進(jìn)行修改概行,只是改下里面的class名稱和內(nèi)容罷了蠢挡。
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>車險(xiǎn)報(bào)價(jià)</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>
    )
  }
}

接下來,重新運(yùn)行項(xiàng)目凳忙,便可以看到如下的app

示例截圖

現(xiàn)在业踏,一個(gè)完整的項(xiàng)目總算成功的跑起來了,接下來我們就來優(yōu)化下src/screens/index.js中的代碼涧卵,最終優(yōu)化后代碼如下
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: '車險(xiǎn)報(bào)價(jià)',
      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: '車險(xiǎn)報(bào)價(jià)'
    },
    {
      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只有一個(gè)注冊(cè)組件的函數(shù)艺演,接收兩個(gè)參數(shù)却紧,一個(gè)是注冊(cè)組件的名稱前綴(可要可不要)桐臊,一個(gè)就是頁面組件的數(shù)組。
這僅僅是小編的方法晓殊,當(dāng)然優(yōu)化代碼還有很多種断凶,相信每個(gè)人都有不同的見解,哪一種最擅長(zhǎng)巫俺,最習(xí)慣就用哪一種认烁。
到此為止,用react-native-navigation正式跑起來了一個(gè)項(xiàng)目介汹!接下來的文章將會(huì)繼續(xù)介紹react-native-navigation的配置以及頁面跳轉(zhuǎn)啥的却嗡,總不能所有的app都是這吊樣,總要根據(jù)設(shè)計(jì)圖做界面調(diào)整的嘹承,期待下一篇文章繼續(xù)介紹窗价!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市叹卷,隨后出現(xiàn)的幾起案子撼港,更是在濱河造成了極大的恐慌,老刑警劉巖骤竹,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帝牡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蒙揣,警方通過查閱死者的電腦和手機(jī)靶溜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來懒震,“玉大人墨技,你說我怎么就攤上這事】胬辏” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵断楷,是天一觀的道長(zhǎng)锨匆。 經(jīng)常有香客問我,道長(zhǎng)冬筒,這世上最難降的妖魔是什么恐锣? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮舞痰,結(jié)果婚禮上土榴,老公的妹妹穿的比我還像新娘。我一直安慰自己响牛,他們只是感情好玷禽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布赫段。 她就那樣靜靜地躺著,像睡著了一般矢赁。 火紅的嫁衣襯著肌膚如雪糯笙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天撩银,我揣著相機(jī)與錄音给涕,去河邊找鬼。 笑死额获,一個(gè)胖子當(dāng)著我的面吹牛够庙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播抄邀,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼耘眨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了撤摸?” 一聲冷哼從身側(cè)響起毅桃,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎准夷,沒想到半個(gè)月后钥飞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衫嵌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年读宙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片楔绞。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡结闸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酒朵,到底是詐尸還是另有隱情桦锄,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布蔫耽,位于F島的核電站结耀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏匙铡。R本人自食惡果不足惜图甜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鳖眼。 院中可真熱鬧黑毅,春花似錦、人聲如沸钦讳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至匪凡,卻和暖如春膊畴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背病游。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工唇跨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衬衬。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓买猖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親滋尉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玉控,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,124評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件狮惜、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評(píng)論 4 62
  • 我認(rèn)識(shí)的一位小姐L高诺,和我一般大,十幾歲就進(jìn)入社會(huì)碾篡,很成熟虱而,機(jī)靈。人也長(zhǎng)得特別漂亮开泽,無論做什么干什么她都會(huì)讓你特別舒...
    畫布坊閱讀 168評(píng)論 2 2
  • 文/綠駿馬 星期天牡拇,一個(gè)讓人精神放松的日子,觀看了紀(jì)錄片《追逐珊瑚》穆律。 抱著欣賞與好奇的心走進(jìn)那片蔚藍(lán)色的海惠呼,海底...
    綠駿馬sja閱讀 586評(píng)論 0 2
  • 當(dāng)黎明的曙光喚醒沉睡的酣眠,作為housewife每天重復(fù)著相同的事情峦耘。 這是我對(duì)早餐的態(tài)度剔蹋,也是我對(duì)待生活...
    A惟楚有材閱讀 540評(píng)論 2 1