手把手教你寫一個RN小程序!

時間過得真快辫塌,眨眼已經(jīng)快3年了!

1.我的第一個App

還記得我14年初寫的第一個iOS小程序胁镐,當時是給別人寫的一個單機的相冊,也是我開發(fā)的第一個完整的app班眯,雖然功能挺少希停,但是耐不住心中的激動啊,現(xiàn)在我開始學react native署隘,那么現(xiàn)在對于react native也算是有所了解了宠能,就用網(wǎng)上的接口開發(fā)一個小程序,現(xiàn)在帶大家來寫這個程序磁餐!接口是用看知乎的API违崇,簡簡單單的只有g(shù)et,可以從這里入門诊霹,也算是帶大家入門吧羞延,過后我會把源代碼放在我的github上,前期項目肯定特別簡陋脾还,后面慢慢來優(yōu)化伴箩,好了,廢話不多說鄙漏,坐穩(wěn)扶好嗤谚,咱們開車了9字搿!9健E陨蕖!
首先需要一個框架椅野,可以省時省力终畅,不再重復(fù)的造輪子。

(1)框架

框架咱們就不再搭建了竟闪,我前面寫了一個特別簡單的框架离福,放在github上了,咱們直接下載下來用就可以了瘫怜,下載地址在我的github上,這個框架是基于react-native-tab-navigator的术徊,運行這個程序,咱們做的第一步就是打開終端配置環(huán)境

$npm install
$npm install react-native-tab-navigator --save

然后我們就可以打開文件運行程序了

(2)修改名稱

用Xcode打開文件navtabbar.xcodeproj鲸湃,進入AppDelegate.m文件中把

RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation                               
moduleName:@"navtabbar"                           
initialProperties:nil                              
launchOptions:launchOptions];

中的moduleName改為你想要的名字赠涮,然后在plist文件中修改Bundle name為你修改過的名字,最后最重要的一步暗挑,打開index.ios.js文件修改注冊入口,
AppRegistry.registerComponent('你修改的名字', () => NavIndex)
現(xiàn)在iOS的App名稱修改完成笋除,可以運行一下看看是不是修改成功!

2.首頁搭建

(1)首頁界面代碼修改

進入login.js文件炸裆,刪除 <Text onPress={this._onPage.bind(this)} style={styles.textStyle}>登錄</Text>

然后添加Image垃它,咱們待會給首頁設(shè)置一個背景圖,添加

TouchableOpacity,
Dimensions,
TextInput

OK,添加這些組件就夠了!

(2)界面搭建

首先,我們先在src文件夾中新建一個images的文件夾烹看,用于存放我們的圖片

現(xiàn)在就可以找一些圖片存進去国拇。

<Image source={require('./images/background.jpg')} style={styles.backgroundStyle}>

然后簡單的登錄一下,當然只是一個界面而已

<FormText style={{marginTop:60}}
                    placeholder='賬號'
                    placeholderTextColor='gray'
                    defaultValue='Demon404'
          />
          <FormText style={{marginTop:10}}
                    placeholder='請輸入密碼'
                    placeholderTextColor='orange'
                    defaultValue=''
          />
          <TouchableOpacity onPress={this._onPage.bind(this)}>
            <Button style={{marginTop:20,width:Width/2,height:40,backgroundColor:'blue',borderRadius:10}}
                    buttonTitle="登錄"

            />
          </TouchableOpacity>

這里的FormText是我自己寫的一個小控件惯殊。
下面可以看一下界面效果



由于沒有post請求酱吝,所以這個頁面大家就簡單的樂呵樂呵就好了,反正下個頁面跟這個頁面沒什么太大關(guān)系.......

(3)主頁搭建

主頁就是一個Tabbar界面土思,目前考慮先有三個模塊!,日后再考慮刪減务热,嗯,就是這么任性己儒!
一個是推送的文章模塊崎岂,一個是搜索模塊,最后的是設(shè)置模塊闪湾。
咱們先看文章模塊主頁面

cellRow(data) {
      return (
          <View style={styles.cellStyle}>
            <Image style={{width:WIDTH-40, height: 100}}
                   source={{uri: data.pic}}
            />
            <Text style={styles.title}>{data.excerpt}</Text>
          </View>
      );
  }

  render() {
    return (
      <View style={styles.container}>
        <NavBar name='看知乎'/>
        <ListView
            initiaListSize={1}
            onEndReachedThreshold={10}
            dataSource={this.state.dataSource}
            renderRow={this.cellRow.bind(this)}
            style={styles.listView}
        />
      </View>
    );
  }

這是我們的ListView頁面的代碼冲甘,只是簡單的抓取看知乎的一個接口頁面,
怎么實現(xiàn)數(shù)據(jù)同步呢?
這就要說到組件的生命周期了:一般來說损合,一個組件類由 extends Component
創(chuàng)建省艳,并且提供一個 render
方法以及其他可選的生命周期函數(shù)、組件相關(guān)的事件或方法來定義嫁审。
咱們這里簡單說一下生命周期函數(shù)
componentWillMount:只會在裝載之前調(diào)用一次,在 render
之前調(diào)用

componentDidMount:只會在裝載完成之后調(diào)用一次赖晶,在 render
之后調(diào)用
componentWillUnmount: 卸載組件時調(diào)用,

constructor(props, context):構(gòu)造函數(shù)律适,在創(chuàng)建組件的時候調(diào)用一次

目前使用的也就這幾個,當然聲明周期所調(diào)用的函數(shù)不僅僅這幾個遏插,這些咱們?nèi)蘸笤僦v捂贿。
在這里,我們簡單的用到了componentDidMount,
首先var GET_URL = 'http://api.kanzhihu.com/getposts';
然后在listView頁面定義數(shù)據(jù)解析方法
componentDidMount(){this.fetchData();}
實現(xiàn):

fetchData(){
fetch(GET_URL)
//ES6的寫法左邊代表輸入的參數(shù)右邊是邏輯處理和返回結(jié)果
.then((response) => response.json())
.then((responseData) => {
this.setState({
dataSource : this.state.dataSource.cloneWithRows(responseData.posts),
});
})
.done();
}
constructor(props) {
super(props);//state內(nèi)部維護的一個狀態(tài)胳嘲,我們剛開始進來的為空厂僧,來加載空的view
this.state = {dataSource: new ListView.DataSource({rowHasChanged: (row1, row2) => row1 !== row2,}),};
}

然后根據(jù)上面的RowData就可以實現(xiàn)下面的頁面效果

1.
2.

圖1就是咱們搭建的主頁,圖2是詳細頁了牛。
圖1和圖2實現(xiàn)原理是相同的颜屠,都是用listView來搭建頁面,那么如何來傳值呢鹰祸?
Nav 有個屬性renderScene 回調(diào)方法有兩個參數(shù)route和navigator甫窟。
大家還記得{...route.params}吧,
咱們需要做的就是在第一個頁面push到第二個頁面的時候這樣寫

this.props.navigator.push({
component:Detail,
params:{nextdata: rowdata},
})

第二個頁面直接寫this.props.nextdata就可以調(diào)用傳過去的rowdata了蛙婴,那么第二個頁面實現(xiàn)起來還難嗎粗井?這里就不在多說了,
ps:大家可以想一下renderRow={this.cellRow.bind(this)}為什么要這么寫街图?當初renderRow={this.cellRow()}不也可以嗎浇衬?

(4)搜索頁搭建

咱么先來看圖吧,這個模塊暫時實現(xiàn)了兩個頁面的功能餐济,以后慢慢添加耘擂,不著急....



這就是那兩個頁面,也非常簡單颤介,我就把思路說一下梳星,大家可以想著做就行了,程序猿嘛滚朵,多動腦還是很好的!,一看就知道冤灾,搜索頁就是幾個簡單的UI,然后出發(fā)幾個方法辕近,這里我是在搜索頁把接口傳到下一頁了韵吨,這個其實不推薦,主要是我為了省代碼移宅,并且搜索名稱和排行榜搜索的接口不太一樣归粉,大家理解就行椿疗,
首先,搜索框這里我用了textinput來代替糠悼,其實功能也是一樣的届榄。點擊放大鏡,把輸入框里的內(nèi)容拼接到接口上倔喂,傳到下一頁铝条,下一頁直接用收到的接口解析就可以了,那么怎么得到textinput里面的值呢席噩?
來看代碼

<TextInput
            style={styles.inputStyle}
            placeholder="請輸入搜索條件!"
            onChangeText={(text) => this.setState({text})}
  />

constructor(props) {
    super(props);
    this.state = {text: ''};
  }
  searchUser(){
    console.log(this.state.text);

看過文檔的朋友應(yīng)該都知道onChangeText的作用是干嘛的班缰,我也不多說,那么列表頁也如同前幾個頁面一樣悼枢,一通則百通埠忘。

3.最后

把完整的gif圖放給大家 ??O(∩∩)O哈哈O(∩∩)O哈哈~

4.總結(jié)

其實這些都非常簡單,從頭到尾都沒用太難的東西馒索,從登錄頁開始莹妒,咱么搭建了賬號和密碼的輸入框,以及頭像和登錄按鈕双揪,這些基礎(chǔ)的UI對大家來說肯定不是問題动羽,對新手來說應(yīng)該問題也不大,使用控件渔期,設(shè)置一下屬性运吓,控制一下位置,這個頁面一點數(shù)據(jù)都沒有用到疯趟。接下來進入首頁拘哨,通過組件生命周期函數(shù),咱么解析下來的數(shù)據(jù)綁定到ListView上面信峻,然后在把需要的字段傳遞到下一頁倦青,下一頁通過拼接的接口解析數(shù)據(jù),展現(xiàn)給大家盹舞,中間還加了一個WebView产镐,因為具體的接口沒有,所以暫時就通過查詢到的數(shù)據(jù)直接把網(wǎng)頁展現(xiàn)給大家踢步,item圖標暫時也沒有換癣亚,這個App暫時只有這些,缺失的東西以后慢慢添加获印,功能模塊也慢慢添加述雾,這里大概的框架也給大家分享了,大家可以自由發(fā)揮....另外代碼有些需要簡化修改,這些我會慢慢來玻孟,
這里我把github上的源碼地址給大家分享一下唆缴,也歡迎大家指出有錯誤的地方,共同學習黍翎,努力提高面徽!
Demon404的github:https://github.com/Demon404/KZHApp
由于引入了react-native-tab-navigator,所以一定要加上去才能運行
install react-native-tab-navigator --save,
本文原創(chuàng)匣掸,首發(fā)地點為博客園

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斗忌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子旺聚,更是在濱河造成了極大的恐慌,老刑警劉巖眶蕉,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砰粹,死亡現(xiàn)場離奇詭異,居然都是意外死亡造挽,警方通過查閱死者的電腦和手機碱璃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饭入,“玉大人嵌器,你說我怎么就攤上這事⌒扯” “怎么了爽航?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長乾忱。 經(jīng)常有香客問我讥珍,道長,這世上最難降的妖魔是什么窄瘟? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任衷佃,我火速辦了婚禮,結(jié)果婚禮上蹄葱,老公的妹妹穿的比我還像新娘氏义。我一直安慰自己,他們只是感情好图云,可當我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布惯悠。 她就那樣靜靜地躺著,像睡著了一般琼稻。 火紅的嫁衣襯著肌膚如雪吮螺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天,我揣著相機與錄音鸠补,去河邊找鬼萝风。 笑死,一個胖子當著我的面吹牛紫岩,可吹牛的內(nèi)容都是我干的规惰。 我是一名探鬼主播,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼泉蝌,長吁一口氣:“原來是場噩夢啊……” “哼歇万!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起勋陪,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤贪磺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后诅愚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寒锚,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年违孝,在試婚紗的時候發(fā)現(xiàn)自己被綠了刹前。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡雌桑,死狀恐怖喇喉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情校坑,我是刑警寧澤拣技,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站撒踪,受9級特大地震影響过咬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜制妄,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一掸绞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧耕捞,春花似錦衔掸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至磷斧,卻和暖如春振愿,著一層夾襖步出監(jiān)牢的瞬間捷犹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工冕末, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留萍歉,地道東北人。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓档桃,卻偏偏與公主長得像枪孩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子藻肄,可洞房花燭夜當晚...
    茶點故事閱讀 45,930評論 2 361

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