React-Native初體驗(yàn)三(window下搭建應(yīng)用的首頁(yè))

如果還沒(méi)有看過(guò)React-Native初體驗(yàn)二請(qǐng)先看React-Native初體驗(yàn)二在回來(lái)看。
ReactNativeTest項(xiàng)目的下載地址:github
1.reactNativeTest項(xiàng)目運(yùn)行的效果


2.實(shí)現(xiàn)啟動(dòng)頁(yè)
導(dǎo)航器的實(shí)現(xiàn)
1.定一個(gè)Welcome.js文件
2.在Welcome.js中使用Navigator導(dǎo)航器
3.給Navigator導(dǎo)航器初始化
Welcome.js文件代碼:

class Welcome extends React.Component {
    /**
     * 構(gòu)造器初始化
     * @param props
     */
    constructor(props) {
        super(props);
        //函數(shù)的定義并初始化
        this.renderScene = this.renderScene.bind(this);
        this.goBack = this.goBack.bind(this);
        //監(jiān)聽(tīng)返回事件
        BackAndroid.addEventListener('hardwareBackPress', this.goBack);
    }
    /**
     * 監(jiān)聽(tīng)手機(jī)點(diǎn)擊返回按鈕
     */
    goBack() {
        return NaviGoBack(_navigator);
    }
    /**
     * 渲染場(chǎng)景的函數(shù):這里接收系統(tǒng)傳來(lái)的兩個(gè)參數(shù),一個(gè)是路由對(duì)象,一個(gè)是導(dǎo)航器對(duì)象
     */
    renderScene(route, navigator) {
        let Component = route.component;//獲取到initialRoute路由中設(shè)計(jì)的Splash組件
        _navigator = navigator;//導(dǎo)航器對(duì)象,在goBack()函數(shù)中需要用到
        return (
            <Component navigator={navigator}  route={route} />//返回一個(gè)渲染界面的Splash組件,并傳遞兩個(gè)參數(shù)
        );
    }
    /**
     * 界面跳轉(zhuǎn)的動(dòng)畫(huà):這里接收系統(tǒng)傳來(lái)的兩個(gè)參數(shù),一個(gè)是路由對(duì)象,一個(gè)是導(dǎo)航器對(duì)象
     */
    configureScene(route, routeStack) {
        return Navigator.SceneConfigs.PushFromRight;
    }
    /**
     * initialRouter: 路由初始化配置信息,就是說(shuō)頁(yè)面加載時(shí),第一次需要展現(xiàn)什么內(nèi)容
     *configureScene: 場(chǎng)景轉(zhuǎn)換動(dòng)畫(huà)配置。在RN看來(lái),從一個(gè)頁(yè)面切換到另外一個(gè)頁(yè)面,就是從一個(gè)場(chǎng)景切換到另外一個(gè)場(chǎng)景,這里配置的是場(chǎng)景動(dòng)畫(huà)信息,比如Navigator.SceneConfigs.FadeAndroid 就是淡入淡出
     *renderScene: 渲染場(chǎng)景,讀取initialRouter傳來(lái)的數(shù)據(jù),確定顯示那些內(nèi)容。
     * */
    render() {
        return (
            <Navigator
                ref='navigator'
                style={styles.navigator}
                configureScene={this.configureScene}
                renderScene={this.renderScene}
                initialRoute={{
                component: Splash,
                name: 'Splash'
          }}
            />
        );
    }
}
/**
 * 彈性(Flex)寬高:
 *
 * 使用flex:1來(lái)指定某個(gè)組件擴(kuò)張以撐滿(mǎn)所有剩余的空間
 *如果有多個(gè)并列的子組件使用了flex:1,則這些子組件會(huì)平分父容器中剩余的空間。
 * 如果這些并列的子組件的flex值不一樣,則誰(shuí)的值更大,誰(shuí)占據(jù)剩余空間的比例就更大
 *
 * 注意:
 * 組件能夠撐滿(mǎn)剩余空間的前提是其父容器的尺寸不為零。
 * */
let styles = StyleSheet.create({
    navigator: {
        flex: 1
    }
});
export default Welcome;

定時(shí)器的實(shí)現(xiàn)

1.定一個(gè)Splash.js文件

2.在構(gòu)造器中獲取導(dǎo)航器Navigator對(duì)象

3.設(shè)計(jì)定時(shí),實(shí)現(xiàn)界面跳轉(zhuǎn)

Splash.js文件代碼:

/**導(dǎo)包*/
import React from 'react';
import {
    StyleSheet,
    Navigator,
    StatusBar,
    BackAndroid,
    View,
    Text,
    Platform
} from 'react-native';
/**導(dǎo)包*/
import Splash from '../Splash';
/**導(dǎo)一個(gè)工具類(lèi)*/
import { NaviGoBack } from '../utils/CommonUtils';
var _navigator;
import React from 'react';
import {
  Dimensions,
  Image,
  InteractionManager,
  View,
  Text,
} from 'react-native';
import AppMain from './page/AppMain.js';
/**獲取手機(jī)屏幕的寬和高*/
var {height, width} = Dimensions.get('window');
class Splash extends React.Component {
  /***
   * 構(gòu)造器
   * 開(kāi)始了一個(gè)定時(shí)器setTimeout(),2500豪秒后跳轉(zhuǎn)到AppMain.js
   * @param props
   */
  constructor(props) {
    super(props);
    //獲取navigator對(duì)象,在welcome.js傳過(guò)來(lái)的
    const {navigator} = props;//可以
    //const {navigator} =this. props;//可以
    //const {navigator} = this.props.navigator;//這個(gè)是不可以的,會(huì)報(bào)錯(cuò)
    //const {navigator} = props.navigator;//這個(gè)是不可以的,會(huì)報(bào)錯(cuò)
    this.timer = setTimeout(() => {
        InteractionManager.runAfterInteractions(() => {
          navigator.resetTo({
            component: AppMain,
            name: 'AppMain'
          });
        });
      }, 2500);
  }
  /**
   * 渲染界面,只有一張圖片
   * @returns {XML}
     */
  render() {
    return (
      <View style={{flex:1}}>
        <Image
          style={{flex:1,width:width,height:height}}
          source={require('./image/ic_welcome.png')}
          />
      </View>
    );
  }
}
export default Splash;

3.修改index.android.js文件

/**這里是導(dǎo)包,導(dǎo)入我們要使用的控件*/
import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View
} from 'react-native';
/**導(dǎo)入一個(gè)自己寫(xiě)的js文件*/
import Welcome from './app/page/Welcome.js';
// 注冊(cè)應(yīng)用(registerComponent)后才能正確渲染
// 注意:只把應(yīng)用作為一個(gè)整體注冊(cè)一次,而不是每個(gè)組件/模塊都注冊(cè)
AppRegistry.registerComponent('reactNativeTest', () => Welcome);

4.運(yùn)行

1.來(lái)到項(xiàng)目根目錄,打開(kāi)cmd

2.執(zhí)行:

react-native start
``
3.來(lái)到項(xiàng)目根目錄,打開(kāi)新的cmd

4.執(zhí)行:

react-native run-android

5.效果:
![](http://upload-images.jianshu.io/upload_images/3086262-0fb0dcf4789c17b6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
3.實(shí)現(xiàn)首頁(yè)

1.定一個(gè)AppMain.js文件

2.監(jiān)聽(tīng)點(diǎn)擊返回按鈕

BackAndroid.addEventListener('hardwareBackPress', xxxxx);

3.實(shí)現(xiàn)頂部導(dǎo)航欄

<View style={styles.headerMenu}>

<View style={{flex:1,justifyContent:'center'}}>

<TouchableOpacity onPress={()=>{this.onClickTitleBar(0)}}>

<View style={{justifyContent:'flex-start',flexDirection:'row',alignItems:'center'}}>

<Image source={require('../image/hotel_ic_home.png')}

style={{width:20,height:26,marginLeft:8}}/>

</View>

</TouchableOpacity>

</View>

<View style={{flex:1,alignItems:'center',justifyContent:'center'}}>

<Text style={{fontSize: 20, textAlign: 'center'}} >首頁(yè) </Text>

</View>

<View style={{justifyContent:'flex-end',alignItems:'center',flex:1,flexDirection:'row'}}>

<TouchableOpacity onPress={()=>{this.onClickTitleBar(1)}}>

<Image source={require('../image/ic_action_search.png')}

style={{width:24,height:24,marginRight:8,alignItems:'center'}}/>

</TouchableOpacity>

</View>

</View>

4.實(shí)現(xiàn):ViewPagerAndroid

<ViewPagerAndroid

ref={viewPager => { this.viewPager = viewPager; }}

style={styles.flex1}

initialPage={0}

pageMargin={0}>

<View style={styles.page}>

<Text>Page 1</Text>

</View>

<View style={styles.page}>

<Text>Page 2</Text>

</View>

<View style={styles.page}>

<Text>Page 3</Text>

</View>

</ViewPagerAndroid>

5.實(shí)現(xiàn)底部導(dǎo)航欄:

<View style={styles.footerMenu}>
<TouchableOpacity onPress={() => this.onClick(1)}>
<Image source={require('../image/ic_menu_deal_off.png')} style={{width:33,height:33}} />
<Text style={styles.welcome} >首頁(yè) </Text>
</TouchableOpacity>
<TouchableOpacity onPress={() => this.onClick(2)}>
<Image source={require('../image/ic_menu_poi_off.png')} style={{width:33,height:33}} />
<Text style={styles.welcome} >商城 </Text>
</TouchableOpacity>
<TouchableOpacity onPress={() => this.onClick(3)} >
<Image source={require("../image/ic_menu_user_off.png")} style={{width:33,height:33,marginLeft:3}}/>
<Text style={styles.welcome} >個(gè)人中心 </Text>
</TouchableOpacity>
</View>

6.實(shí)現(xiàn)點(diǎn)擊事件:TouchableOpacity

<TouchableOpacity onPress={()=>{this.onClickTitleBar(0)}}>
.....
</TouchableOpacity>

AppMain.js文件代碼:
                <Image source={require('../image/ic_menu_deal_off.png')} style={{width:33,height:33}} />
                <Text style={styles.welcome} >首頁(yè) </Text>
            </TouchableOpacity>
            <TouchableOpacity onPress={() => this.onClick(2)}>
                <Image source={require('../image/ic_menu_poi_off.png')} style={{width:33,height:33}} />
                <Text style={styles.welcome} >商城 </Text>
            </TouchableOpacity>
            <TouchableOpacity onPress={() => this.onClick(3)} >
                <Image source={require("../image/ic_menu_user_off.png")} style={{width:33,height:33,marginLeft:3}}/>
                <Text style={styles.welcome} >個(gè)人中心 </Text>
            </TouchableOpacity>
        </View>
     </View>
    );
}

}
/**

  • 屬性介紹:
  • flexDirection:
  • style中指定flexDirection可以決定布局的主軸。子元素是應(yīng)該沿著水平軸(row)方向排列,還是沿著豎直軸(column)方向排列呢?默認(rèn)值是豎直軸(column)方向
  • justifyContent:

*style中指定justifyContent可以決定其子元素沿著主軸的排列方式。子元素是應(yīng)該靠近主軸的起始端還是末尾段分布呢?亦或應(yīng)該均勻分布?對(duì)應(yīng)的這些可選項(xiàng)有:flex-start、center、flex-end、space-around以及space-between

  • alignItems:
  • 在組件的style中指定alignItems可以決定其子元素沿著次軸(與主軸垂直的軸,比如若主軸方向?yàn)閞ow,則次軸方向?yàn)閏olumn)的排列方式。子元素是應(yīng)該靠近次軸的起始端還是末尾段分布呢?亦或應(yīng)該均勻分布?對(duì)應(yīng)的這些可選項(xiàng)有:flex-start、center、flex-end以及stretch。
  • backgroundColor 背景顏色
  • borderColor 邊界顏色
    */
    var styles = {
    flex1: {
    flex: 1,
    },
    page: {
    alignItems: 'center',
    flexDirection: 'row',
    flex: 1,
    justifyContent: 'center',
    //borderWidth: 1,
    borderColor: 'black',
    },
    headerMenu: {
    flexDirection: 'row',
    backgroundColor: '#F2F2F2',
    height: 50,
    paddingHorizontal: 10,
    },
    footerMenu: {
    flexDirection: 'row',
    justifyContent: 'space-between',
    alignItems: 'center',
    backgroundColor: '#F2F2F2',
    height: 60,
    paddingHorizontal: 40,
    },
    img: {
    alignItems: 'center',
    justifyContent: 'center',
    width:90,
    height:90
    },
    welcome: {
    fontSize: 10,
    textAlign: 'center',
    },
    line: {
    backgroundColor: '#cdcdcd',
    height: 1,
    },
    }
    export default AppMain;
6.運(yùn)行

1.來(lái)到項(xiàng)目根目錄,打開(kāi)cmd

2.執(zhí)行:

react-native start

3.來(lái)到項(xiàng)目根目錄,打開(kāi)新的cmd

4.執(zhí)行:

react-native run-android

5.效果:
![](http://upload-images.jianshu.io/upload_images/3086262-0fb0dcf4789c17b6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
7.最后附上整個(gè)reactNativeTest項(xiàng)目的結(jié)構(gòu)圖
![](http://upload-images.jianshu.io/upload_images/3086262-66f5b8d4c0479f49.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


來(lái)源:http://bbs.520it.com/forum.php?mod=viewthread&tid=2244
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評(píng)論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,489評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,290評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,776評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,510評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,866評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,036評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,585評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,331評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,536評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,754評(píng)論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,154評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,469評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,273評(píng)論 3 399
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,505評(píng)論 2 379

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

  • 前言 本文有配套視頻,可以酌情觀看。 文中內(nèi)容因各人理解不同,可能會(huì)有所偏差,歡迎朋友們聯(lián)系我。 文中所有內(nèi)容僅供...
    珍此良辰閱讀 1,162評(píng)論 0 6
  • 前言 學(xué)習(xí)本系列內(nèi)容需要具備一定 HTML 開(kāi)發(fā)基礎(chǔ),沒(méi)有基礎(chǔ)的朋友可以先轉(zhuǎn)至 HTML快速入門(mén)(一) 學(xué)習(xí) 本人...
    珍此良辰閱讀 4,540評(píng)論 2 19
  • 前言 學(xué)習(xí)本系列內(nèi)容需要具備一定 HTML 開(kāi)發(fā)基礎(chǔ),沒(méi)有基礎(chǔ)的朋友可以先轉(zhuǎn)至 HTML快速入門(mén)(一) 學(xué)習(xí) 本人...
    珍此良辰閱讀 7,307評(píng)論 33 15
  • 本文只是簡(jiǎn)單地介紹下在React-Native中,使用CSS的Flex布局方式,完成RN中的控件布局,掌握這個(gè)布局...
    劉是丑閱讀 1,136評(píng)論 0 1
  • 前言 學(xué)習(xí)本系列內(nèi)容需要具備一定 HTML 開(kāi)發(fā)基礎(chǔ),沒(méi)有基礎(chǔ)的朋友可以先轉(zhuǎn)至 HTML快速入門(mén)(一) 學(xué)習(xí) 本人...
    珍此良辰閱讀 3,220評(píng)論 1 12