我的React-Native不得不說的一些事情-5

ListView

創建文檔時間:2016.3.23-09:18
作者:三月懶驢
使用平臺:Mac

作用

ListView在APP的作用可謂是重中之重,除非你不需要要多信息展示,否則的話,一個APP肯定是要用ListView來工作的。而優化它,也是必須的。

簡單代碼

'use strict'
import React from 'react-native'
let {Component,StyleSheet,View,Text,ListView} = React;

class List extends Component{
    constructor(props){
        super(props)
        let ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
        this.state = {
            dataSource: ds.cloneWithRows(['row 1']),
        };
    }
    renderRow(rowData){
        return <Text>{rowData}</Text>
    }
    render(){
        return (
            <ListView
              style={styles.body}
              dataSource={this.state.dataSource}
              renderRow={this.renderRow} />
            
        );
    }
}

const styles = {
    body:{
        flex:1,
    },
}

export default List

一個簡單的ListView

一個ListView的最簡單參數有兩個:
一個是dataSource:數據源,
另外一個是renderRow,渲染每一行的動作。

  • 先簡單看看:初始化一個數據源

      let ds = new ListView.DataSource();
    
  • 里面的參數:后面是ES6語法的箭頭函數,就是為rowHasChanged定義一個函數

      rowHasChanged: (r1, r2) => r1 !== r2
    
  • 下面把數據填入初始化的數據源去。

      dataSource: ds.cloneWithRows(['row 1']),
    
  • renderRow
    傳來的參數有:rowData, sectionID, rowID, highlightRow
    這里主要用了rowData,也就是我們剛才填進去的數據:一個數組

由上面可以看到,我們先定義一個數據源,就是一個數組,這個數組就會在renderRow的時候,以rowData傳入。傳入之后我們可以把它渲染出來,至于渲染的樣式的話,可以自己寫,看方法: renderRow

Section

API里面木有細說這個東西,不過看例子的話,我們可以看到官方的例子里面不是像我們這樣寫的

//我們的寫法
this.state = {
    dataSource: ds.cloneWithRows(['row 1']),
};
//官方
this.state = {
    dataSource: ds.而是cloneWithRowsAndSections(['row 1']),
};

cloneWithRows & cloneWithRowsAndSections。那么這兩個有什么不同?什么又是Sections!如果你是一個前端的話,你會很簡單明白Section!其實就是表頭,以前用Table標簽一樣也有表頭這個東西。而在IOS里面,表頭在滾動到頂部的時候會附在頂部。我們這里稱之為Section。官方木有很多的文檔去說明它,但是用起來的時候很簡單。

在木有Section的時候,我們只需提供一個數組過去就行,而當你需要表頭的時候,你需要提供的是一個對象!

下面舉個例子:

//木有Section的時候
var data = [1,2,3,4,5,6]
//有Section的時候
var data = {
    'section1':[1,2,4,5,6],
    'section2':[1,2,4,5,6],
}
'use strict'
import React from 'react-native'
let {Component,StyleSheet,View,Text,ListView} = React;


/*renderSectionHeader*/ 

class List extends Component{
    constructor(props){
        super(props)
        let ds = new ListView.DataSource({
            rowHasChanged: (r1, r2) => r1 !== r2,
            sectionHeaderHasChanged: (s1, s2) => s1 !== s2
        });
        this.state = {
            dataSource: ds.cloneWithRowsAndSections(this.getRows()),
        };
    }
    getRows(){
        let dataObj = {}
        let section = '測試1'
        dataObj[section] = []
        for (let i=0;i<10;i++){
            let data = {
                name:'第'+i+'行',
                num:i
            }
            dataObj[section][i] = data
        }
        section = '測試2'
        dataObj[section] = []
        for (let i=0;i<10;i++){
            let data = {
                name:'第'+i+'行',
                num:i
            }
            dataObj[section][i] = data
        }
        return dataObj
    }
    renderRow(rowData,sectionID,rowID,highlightRow){
        console.log(sectionID);
        return (
            <View style={styles.rowItem}>
                <View style={styles.rowItemLeft}>
                    <Text style={styles.rowItemText}>{rowData.name}</Text>
                </View>
                <View style={styles.rowItemRight}>
                    <Text style={styles.rowItemText}>數據:{rowData.num}</Text>
                </View>
            </View>
        )
    }
    onEndReached(e){
        //console.log(e)
    }
    renderSectionHeader(sectionData, sectionID){
        console.log(sectionData)
        return(
            <View style={styles.rowTite}>
                <Text>{sectionID}</Text>
            </View>
        )
    }
    onChangeVisibleRows(visibleRows, changedRows){
        //console.log(visibleRows)
    }
    render(){
        return (
            <ListView
              style={styles.body}
              onEndReached = {this.onEndReached}
              onEndReachedThreshold = {20}
              renderSectionHeader = {this.renderSectionHeader}
              onChangeVisibleRows = {this.onChangeVisibleRows}
              dataSource={this.state.dataSource}
              renderRow={this.renderRow} />
            
        )
    }
}

const styles = {
    body:{
        flex:1,
    },
    rowItem:{
        flex:1,
        height:50,
        flexDirection:'row',
        justifyContent:'center',
        alignItems:'center',
        borderBottomWidth:1,
        borderBottomColor:'#ddd',
        
    },
    rowTite:{
        height:30,
        alignItems:'center',
        justifyContent:'center',
        backgroundColor:'#ccc',
    },
    rowItemLeft:{
        flex:1, 
        borderRightWidth:1,
        borderRightColor:'#ccc',
    },
    rowItemRight:{
        flex:3,
    },
    rowItemText:{
        textAlign:'center'
    },
}

export default List

課后練習

其他的API,自己可以試試

  • initialListSize:一開始渲染幾個!如果寫成1的話,會看到一項一項出來。
  • onChangeVisibleRows 的 visibleRows, changedRows: 前者是當前頁面可用看到的List Item 的ID 集合,以 { sectionID: { rowID: true }}形式表示,后者是頁面發生變化了,導致List Item變化的Item 狀態集合, { sectionID: { rowID: true | false }} 表示
  • onEndReached / onEndReachedThreshold:設定了onEndReachedThreshold之后就判斷,快到底部onEndReachedThreshold像素的時候,調用onEndReachedThreshold。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,115評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,577評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,514評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,234評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,621評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,822評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,380評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,128評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,319評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,548評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,970評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,229評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,048評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,285評論 2 376

推薦閱讀更多精彩內容

  • 前言 學習本系列內容需要具備一定 HTML 開發基礎,沒有基礎的朋友可以先轉至 HTML快速入門(一) 學習 本人...
    珍此良辰閱讀 13,364評論 11 24
  • 一. 簡介 一個核心組件,用于高效地顯示一個可以垂直滾動的變化的數據列表。最基本的使用方式就是創建一個ListVi...
    飛奔的小馬閱讀 1,279評論 0 2
  • 夜深了,失眠了。 窗外的雨聲淅淅瀝瀝的下個不停,家里的貓在黑夜里繼續尋食,我摸著黑來到冰箱前,拿起之前七夕節購賣的...
    刺猬尤尾閱讀 472評論 0 0