React-Native學(xué)習(xí)系列(四)-ListView&Fetch()

前言

去年我寫了一個(gè)教程晨继,手把手教你寫一個(gè)RN小程序!,里面其實(shí)對(duì)ListView已經(jīng)做了一些詳解,不過由于那個(gè)項(xiàng)目接口停止維護(hù),再加上RN教程準(zhǔn)備寫一個(gè)系列砚嘴,所以重新寫一篇文章來完善ListView的使用。另外拘鞋,ListView一般都是配合數(shù)據(jù)來使用的落剪,所以這里我把網(wǎng)絡(luò)請(qǐng)求也順帶簡(jiǎn)單的講解一下。本文會(huì)使用豆瓣api來進(jìn)行數(shù)據(jù)的解析主卫。

fetch()

React Native提供了和web標(biāo)準(zhǔn)一致的Fetch API工育,用于滿足開發(fā)者訪問網(wǎng)絡(luò)的需求虾宇。那么如何使用呢?

fetch使用

fetch('https://api.douban.com/v2/movie/top250')//豆瓣電影Top250

從任意地址獲取數(shù)據(jù)如绸,只需要這么寫就可以了嘱朽,把地址傳遞給fetch()方法。

  fetch('https://api.douban.com/v2/movie/top250')
    //ES6的寫法左邊代表輸入的參數(shù)右邊是邏輯處理和返回結(jié)果
    .then((response) => response.json())
    .then((responseData) => {
       this.setState({
         data: responseData,
         });
       })
    .done();  

以上是fetch通過get請(qǐng)求獲取的數(shù)據(jù)怔接,這個(gè)可以獲取數(shù)據(jù)源data搪泳,那么我們登錄注冊(cè)一般都是用的post提交方式,那該如何寫呢扼脐?
fetch()還有可選的第二個(gè)參數(shù)用來指定請(qǐng)求的方法岸军,你可以指定header參數(shù),或是指定使用POST方法瓦侮,又或是提交數(shù)據(jù)等等艰赞。

fetch('https://mywebsite.com/endpoint/', {
  method: 'POST',//指定POST方法
  headers: {//指定header參數(shù)
    'Accept': 'application/json',
    'Content-Type': 'application/json',
  },
 body: JSON.stringify({//設(shè)置提交的數(shù)據(jù)
    firstParam: 'yourValue',
    secondParam: 'yourOtherValue',
})
}) 
.then((response) => response.json())  
.then((responseData) => {
    //responseData是服務(wù)器返回的data
}

})
  .done();  

簡(jiǎn)單的fetch()請(qǐng)求就介紹到這里,有想法的同學(xué)可以參考該文章:【翻譯】這個(gè)API很“迷人”——(新的Fetch API)

溫馨提示肚吏,iOS默認(rèn)不支持http請(qǐng)求方妖,請(qǐng)?jiān)赬code中設(shè)置

1、在Info.plist中添加NSAppTransportSecurity類型Dictionary须喂。

2吁断、在NSAppTransportSecurity下添加NSAllowsArbitraryLoads類型Boolean,值設(shè)為YES

組件生命周期

一般來說,一個(gè)組件類由 extends Component創(chuàng)建坞生,并且提供一個(gè) render方法以及其他可選的生命周期函數(shù)仔役、組件相關(guān)的事件或方法來定義。

getInitialState()函數(shù) 初始化 this.state 的值是己,只在組件裝載之前調(diào)用一次又兵。
getDefaultProps()函數(shù) 只在組件創(chuàng)建時(shí)調(diào)用一次并緩存返回的對(duì)象,因?yàn)檫@個(gè)方法在實(shí)例初始化之前調(diào)用,所以在這個(gè)方法里面不能依賴 this 獲取到這個(gè)組件的實(shí)例卒废。
render() 組裝生成這個(gè)組件的 HTML 結(jié)構(gòu) ,必須要有的函數(shù)

生命周期函數(shù)

componentWillMount() 只會(huì)在裝載之前調(diào)用一次沛厨,在 render 之前調(diào)用,你可以在這個(gè)方法里面調(diào)用 setState 改變狀態(tài)
componentDidMount() 只會(huì)在裝載完成之后調(diào)用一次摔认,在 render 之后調(diào)用逆皮,從這里開始可以通過 ReactDOM.findDOMNode(this) 獲取到組件的 DOM 節(jié)點(diǎn)。
componentWillUnmount() 卸載組件觸發(fā)
更新組件時(shí)觸發(fā)的函數(shù):
componentWillReceiveProps()
shouldComponentUpdate()
componentWillUpdate()
componentDidUpdate

ListView

ListView是一個(gè)常用核心組件参袱,用于高效地顯示一個(gè)可以垂直滾動(dòng)的變化的數(shù)據(jù)列表电谣。通過創(chuàng)建一個(gè)ListView.DataSource數(shù)據(jù)源秽梅,然后給它傳遞一個(gè)普通的數(shù)據(jù)數(shù)組,再使用數(shù)據(jù)源來實(shí)例化一個(gè)ListView組件剿牺,并且定義它的renderRow回調(diào)函數(shù)企垦,這個(gè)函數(shù)會(huì)接受數(shù)組中的每個(gè)數(shù)據(jù)作為參數(shù),返回一個(gè)可渲染的組件(作為listview的每一行)晒来。

cellRow(data) {
  return (
      <View >//這個(gè)是cell的視圖
      </View>
  );  
 }

render() {
    return (
     <View style={styles.container}>
     <ListView
            initiaListSize={1} //指定在組件剛掛載的時(shí)候渲染多少行數(shù)據(jù)钞诡。用來確保首屏顯示合適數(shù)量的數(shù)據(jù)
            //onChangeVisibleRows={()=>{}}//當(dāng)可見的行的集合變化的時(shí)候調(diào)用此回調(diào)函數(shù)  
            //onEndReached={()=>{}}//當(dāng)所有的數(shù)據(jù)都已經(jīng)渲染過,并且列表被滾動(dòng)到距離最底部不足onEndReachedThreshold個(gè)像素的距離時(shí)調(diào)用湃崩。配合onEndReachedThreshold使用
            onEndReachedThreshold={10} //調(diào)用onEndReached之前的臨界值荧降,單位是像素。
            pageSize={3} //每次渲染的行數(shù)
            removeClippedSubviews={true}//用于提升大列表的滾動(dòng)性能攒读。需要給行容器添加樣式overflow:'hidden'誊抛。(Android已默認(rèn)添加此樣式)。此屬性默認(rèn)開啟整陌。
            dataSource={this.state.dataSource} //列表依賴的數(shù)據(jù)源
            renderRow={this.cellRow.bind(this)}//(rowData, sectionID, rowID, highlightRow) => renderable 從數(shù)據(jù)源(Data source)中接受一條數(shù)據(jù),以及它和它所在section的ID瞎领。返回一個(gè)可渲染的組件來為這行數(shù)據(jù)進(jìn)行渲染泌辫。
            style={styles.listView}
     />
     </View>
    );
 }  

renderSectionHeader()方法會(huì)為每個(gè)section提供一個(gè)粘性的標(biāo)題
scrollTo(...args),滾動(dòng)到指定的x,y偏移處。

ListView和Fetch()結(jié)合使用

1.新建一個(gè)文件

import React, { Component } from 'react';
import {
StyleSheet,
Text,
View,
ListView
} from 'react-native';
export default class TestDemo extends Component {
render() {
    return (
    <View style={styles.container}>
    </View>
    );
}
}
const styles = StyleSheet.create({
container:{
flex:1,
}
});  

2.引入ListView

<ListView initiaListSize={2}
          pageSize={2}
          dataSource={this.state.dataSource}
          renderRow={this.cellRow.bind(this)}
          style={styles.listView}
/>  

然后根據(jù)文檔添加數(shù)據(jù)源dataSource

constructor(props){
super(props);
const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
this.state = {dataSource: ds.cloneWithRows([{},])};
}  

我們的Cell也必定不能少啊

cellRow(data) {
    return (
        <TouchableOpacity onPress={()=>this.rowPressed(data)}>
      <View>
        <View style={styles.cellStyle}>
            <Image style={{margin:10,width:100, resizeMode:'contain',height:(WIDTH-40)/2}}
                   source={{uri: data.images.large}}
            />
            <Text style={styles.title}>{data.title}</Text>
        </View>
      </View>
    </TouchableOpacity>
    );
}  

OK基本上完工九默,說好的fetch呢震放?別著急,慢慢來

componentDidMount() {
    this.fetchData();
}
fetchData() {
    fetch(GET_URL)
        //ES6的寫法左邊代表輸入的參數(shù)右邊是邏輯處理和返回結(jié)果
        .then((response) => response.json())
        .then((responseData) => {
            if (responseData.subjects) {
            //我們需要在數(shù)據(jù)解析完成的時(shí)候來setdataSource
                this.setState({
                    dataSource: this.state.dataSource.cloneWithRows(responseData.subjects),
                });
            } else {
                //do Something 
                Alert.alert('暫時(shí)沒有數(shù)據(jù)');
            }
        })

    .done
}

恩驼修,測(cè)試的話殿遂,GET_URL是https://api.douban.com/v2/movie/top250,
至此基本上已經(jīng)完工,大家可以試著做一下

from Demon404

)

最后

當(dāng)然要附上我們的源碼了乙各,在我的github上:React-Native-Study
后續(xù)會(huì)更新帶Header的ListView和用ListView寫的九宮格墨礁,喜歡的同學(xué)可以支持一下,么么噠耳峦!

from Demon404
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末恩静,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蹲坷,更是在濱河造成了極大的恐慌驶乾,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件循签,死亡現(xiàn)場(chǎng)離奇詭異级乐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)县匠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門风科,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撒轮,“玉大人,你說我怎么就攤上這事丐重∏徽伲” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵扮惦,是天一觀的道長(zhǎng)臀蛛。 經(jīng)常有香客問我,道長(zhǎng)崖蜜,這世上最難降的妖魔是什么浊仆? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮豫领,結(jié)果婚禮上抡柿,老公的妹妹穿的比我還像新娘。我一直安慰自己等恐,他們只是感情好洲劣,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著课蔬,像睡著了一般囱稽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上二跋,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天战惊,我揣著相機(jī)與錄音,去河邊找鬼扎即。 笑死吞获,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谚鄙。 我是一名探鬼主播各拷,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼闷营!你這毒婦竟也來了撤逢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤粮坞,失蹤者是張志新(化名)和其女友劉穎蚊荣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莫杈,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡互例,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了筝闹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媳叨。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腥光,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出糊秆,到底是詐尸還是另有隱情武福,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布痘番,位于F島的核電站捉片,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏汞舱。R本人自食惡果不足惜伍纫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昂芜。 院中可真熱鬧莹规,春花似錦、人聲如沸泌神。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽欢际。三九已至债热,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間幼苛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工焕刮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舶沿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓配并,卻偏偏與公主長(zhǎng)得像括荡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子溉旋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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