React-Native 20分鐘入門指南

背景

為什么需要React-Native纪岁?

在React-Native出現(xiàn)之前移動(dòng)端主流的開(kāi)發(fā)模式是原生開(kāi)發(fā)和Hybrid開(kāi)發(fā)(H5混合原生開(kāi)發(fā))卢佣,Hybrid app相較于native app的優(yōu)勢(shì)是開(kāi)發(fā)成本低開(kāi)發(fā)速度快(H5頁(yè)面開(kāi)發(fā)跨平臺(tái),無(wú)需重新寫web陵究、android奢人、ios代碼)蓬戚,盡管native app在開(kāi)發(fā)上需要更多時(shí)間饺著,但卻帶來(lái)了更好的用戶體驗(yàn)(頁(yè)面渲染亚隙、手勢(shì)操作的流暢性)磁餐,也正是基于這兩點(diǎn)Facebook在2015年推出了React-Native

What we really want is the user experience of the native mobile platforms, combined with the developer experience we have when building with React on the web.

上文摘自React-Native發(fā)布稿,React-Native的開(kāi)發(fā)既保留了React的開(kāi)發(fā)效率又擁有媲美原生的用戶體驗(yàn)阿弃,其運(yùn)行原理并非使用webview所以不屬于Hybrid開(kāi)發(fā)诊霹,想了解的可以查看React Native運(yùn)行原理解析這篇文章羞延。React-Native提出的理念是‘learn once,write every where’脾还,之所以不是‘learn once, run every where’伴箩,是因?yàn)椴煌脚_(tái)的用戶體驗(yàn)有所不同,因此要運(yùn)行全平臺(tái)仍需要一些額外的適配鄙漏,這里是Occhino對(duì)React-Native的介紹嗤谚。

image
image

上面兩張圖展示了React-Native的對(duì)于開(kāi)發(fā)者的熱門程度,且官方對(duì)其的開(kāi)發(fā)狀態(tài)一直更新泥张,這也是其能搶占原生開(kāi)發(fā)市場(chǎng)的重要因素呵恢。

搭建開(kāi)發(fā)環(huán)境

在創(chuàng)建項(xiàng)目前我們需要先搭建React-Native所需的開(kāi)發(fā)環(huán)境。
第一步需要先安裝nodejs媚创、python2渗钉、jdk8(windows有所不同,推薦使用macos開(kāi)發(fā)钞钙,輕松省事)

brew install node //macos自帶python和jdk

第二步安裝React Native CLI

npm install -g react-native-cli

第三步安裝Android Studio鳄橘,參考官方的開(kāi)發(fā)文檔

創(chuàng)建第一個(gè)應(yīng)用

使用react-native命令創(chuàng)建一個(gè)名為HelloReactNative的項(xiàng)目

react-native init HelloReactNative

等待其下載完相關(guān)依賴后,運(yùn)行項(xiàng)目

react-native run-ios
or
react-native run-android

成功運(yùn)行后的出現(xiàn)的界面是這樣的

image

基本的JSX和ES6語(yǔ)法

先看一下運(yùn)行成功后的界面代碼

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

import React, {Component} from 'react';
import {
    Platform,
    StyleSheet,
    Text,
    View
} from 'react-native';

const instructions = Platform.select({
    ios: 'Press Cmd+R to reload,\n' +
    'Cmd+D or shake for dev menu',
    android: 'Double tap R on your keyboard to reload,\n' +
    'Shake or press menu button for dev menu',
});

//noinspection BadExpressionStatementJS
type
Props = {};
//noinspection JSAnnotator
export default class App extends Component<Props> {
    render() {
        return (
            <View style={styles.container}>
                <Text style={styles.welcome}>
                    Welcome to React Native!
                </Text>
                <Text style={styles.instructions}>
                    To get started, edit App.js
                </Text>
                <Text style={styles.instructions}>
                    {instructions}
                </Text>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
    },
    welcome: {
        fontSize: 20,
        textAlign: 'center',
        margin: 10,
    },
    instructions: {
        textAlign: 'center',
        color: '#333333',
        marginBottom: 5,
    },
});

代碼中出現(xiàn)的import芒炼、export瘫怜、extendsclass以及未出現(xiàn)的() =>箭頭函數(shù)均為ES6需要了解的基礎(chǔ)語(yǔ)法本刽,import表示引入需要的模塊鲸湃,export表示導(dǎo)出模塊,extends表示繼承自某個(gè)父類子寓,class表示定義一個(gè)類暗挑,()=>為箭頭函數(shù),用此語(yǔ)法定義的函數(shù)帶有上下文信息斜友,因此不必再處理this引用的問(wèn)題炸裆。
<Text style={styles.welcome}>Welcome to React Native!</Text>這段代碼是JSX語(yǔ)法使用方式,和html標(biāo)記語(yǔ)言一樣鲜屏,只不過(guò)這里引用的是React-Native的組件烹看,Text是一個(gè)顯示文本的組件,可以看到style={styles.welcome}這是JSX的另一個(gè)語(yǔ)法可以將有效的js表示式放入大括號(hào)內(nèi)洛史,Welcome to React Native!為其內(nèi)容文本惯殊,可以嘗試修改他的內(nèi)容為Hello React Native!,刷新界面后

image

熟悉更多的ES6語(yǔ)法有助于更有效率的開(kāi)發(fā)也殖。

組件的屬性和狀態(tài)

在了解了一些基本的JSX和ES6語(yǔ)法后靠胜,我們還需要了解兩個(gè)比較重要的概念即propsstateprops為組件的屬性,state為組件的狀態(tài)浪漠,兩者間的區(qū)別在于陕习,props會(huì)在組件被實(shí)例化時(shí)通過(guò)構(gòu)造參數(shù)傳入,所以props的傳遞為單向傳遞址愿,且只能由父組件控制该镣,state為組件的內(nèi)部狀態(tài)由組件自己管理,不受外界影響响谓。propsstate都能修改組件的狀態(tài)损合,兩者的改變會(huì)導(dǎo)致相關(guān)引用的組件狀態(tài)改變,也就是說(shuō)在組件的內(nèi)部存在子組件引用了propsstate娘纷,那么當(dāng)發(fā)生改變時(shí)相應(yīng)子組件會(huì)重新渲染嫁审,其實(shí)這里也可以看出propsstate的使用聯(lián)系,父組件可以通過(guò)setState修改state赖晶,并將其傳遞到子組件的props中使子組件重新渲染從而使父組件重新渲染律适。

組件生命周期

image

組件的生命周期會(huì)經(jīng)歷三個(gè)階段

Mounting:掛載
Updating:更新
Unmounting:移除

對(duì)應(yīng)的生命周期回調(diào)方法為

componentWillMount()//組件將要掛載時(shí)調(diào)用
render()//組件渲染時(shí)調(diào)用
componentDidMount()//組件掛載完成時(shí)調(diào)用
componentWillReceiveProps(object nextProps)//組件props和state改變時(shí)調(diào)用
shouldComponentUpdate(object nextProps,object nextState)//返回false不更新組件,一下兩個(gè)方法不執(zhí)行
componentWillUpdate(object nextProps,object nextState)//組件將要更新時(shí)調(diào)用
componentDidUpdate(object nextProps,object nextState)//組件完成更新時(shí)調(diào)用
componentWillUnmount()//組件銷毀時(shí)調(diào)用

這里我們需要重點(diǎn)關(guān)注的地方在于組件運(yùn)行的階段遏插,組件每一次狀態(tài)收到更新都會(huì)調(diào)用render()方法捂贿,除非shouldComponentUpdate方法返回false,可以通過(guò)此方法對(duì)組件做一些優(yōu)化避免重復(fù)渲染帶來(lái)的性能消耗胳嘲。

樣式

React-Native樣式實(shí)現(xiàn)了CSS的一個(gè)子集厂僧,樣式的屬性與CSS稍有不同,其命名采用駝峰命名了牛,對(duì)前端開(kāi)發(fā)者來(lái)說(shuō)基本沒(méi)差颜屠。使用方式也很簡(jiǎn)單,首先使用StyleSheet創(chuàng)建一個(gè)styles

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

然后將對(duì)應(yīng)的style傳給組件的style屬性鹰祸,例如<View style={styles.container}/>

常用組件

在日常開(kāi)發(fā)中最常使用的組件莫過(guò)于View,Text,Image,TextInput的組件甫窟。

View基本上作為容器布局,在里面可以放置各種各樣的控件福荸,一般只需要為其設(shè)置一個(gè)style屬性即可蕴坪,常用的樣式屬性有flex,width,height,backgroundColor,flexDirector,margin,padding更多可以查看Layout Props肴掷。

Text是一個(gè)顯示文本的控件敬锐,只需要在組件的內(nèi)容區(qū)填寫文字內(nèi)容即可,例如<Text>Hello world</Text>,可以為設(shè)置字體大小和顏色<Text style={{fontSize:14,color:'red'}}>Hello world</Text>,同時(shí)也支持嵌套Text呆瞻,例如

<Text style={{fontWeight: 'bold'}}>
        I am bold
        <Text style={{color: 'red'}}>
          and red
        </Text>
</Text>

TextInput是文本輸入框控件台夺,其使用方式也很簡(jiǎn)單

<TextInput
     style={{width:200,height:50}}
     onChangeText={(text)=>console.log(text)}
/>

style設(shè)置了他的樣式,onChangeText傳入一個(gè)方法痴脾,該方法會(huì)在輸入框文字發(fā)生變化時(shí)調(diào)用颤介,這里我們使用console.log(text)打印輸入框的文字。

Image是一個(gè)圖片控件,幾乎所有的app都會(huì)使用圖片作為他們的個(gè)性化展示滚朵,Image可以加載本地和網(wǎng)絡(luò)上的圖片冤灾,當(dāng)加載網(wǎng)絡(luò)圖片時(shí)必須設(shè)定控件的大小,否則圖片將無(wú)法展示

加載本地圖片,圖片地址為相對(duì)地址
<Image style={{width:100,height:100}} source={require('../images/img001.png')}/>
加載網(wǎng)絡(luò)圖片
<Image style={{width:100,height:100}} source={{uri:'https://facebook.github.io/react-native/docs/assets/favic
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辕近,一起剝皮案震驚了整個(gè)濱河市韵吨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌移宅,老刑警劉巖归粉,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異漏峰,居然都是意外死亡糠悼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門浅乔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)倔喂,“玉大人,你說(shuō)我怎么就攤上這事童擎〉尉ⅲ” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵顾复,是天一觀的道長(zhǎng)班挖。 經(jīng)常有香客問(wèn)我,道長(zhǎng)芯砸,這世上最難降的妖魔是什么萧芙? 我笑而不...
    開(kāi)封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮假丧,結(jié)果婚禮上双揪,老公的妹妹穿的比我還像新娘。我一直安慰自己包帚,他們只是感情好渔期,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著渴邦,像睡著了一般疯趟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谋梭,一...
    開(kāi)封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天信峻,我揣著相機(jī)與錄音,去河邊找鬼瓮床。 笑死盹舞,一個(gè)胖子當(dāng)著我的面吹牛产镐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播踢步,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼癣亚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了获印?” 一聲冷哼從身側(cè)響起逃糟,我...
    開(kāi)封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蓬豁,沒(méi)想到半個(gè)月后绰咽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡地粪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年取募,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蟆技。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡玩敏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出质礼,到底是詐尸還是另有隱情旺聚,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布眶蕉,位于F島的核電站砰粹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏造挽。R本人自食惡果不足惜碱璃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饭入。 院中可真熱鬧嵌器,春花似錦、人聲如沸谐丢。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乾忱。三九已至讥珍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間饭耳,已是汗流浹背串述。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工执解, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寞肖,地道東北人纲酗。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像新蟆,于是被迫代替她去往敵國(guó)和親觅赊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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