RN的ScrollView和ListView

1、ScrollView組件

RN封裝了Android與IOS兩大操作系統(tǒng)提供的滾動(dòng)視圖組件,該組件支持RN組件View的所有屬性,本身沒(méi)有獨(dú)有的樣式設(shè)計(jì)。

1.1 ScrollView組件屬性

ScrollView除了擁有View的屬性外,還有以下獨(dú)有屬性:
1、contentContainerStyle:
用于定義組件的容器樣式(容器中包括所有子組件)
2、horizontal:
布爾類(lèi)型,默認(rèn)為false,如果為true,滾動(dòng)列表所有子組件將水平排列。
3、KeyboardDismissMode:
@字符串類(lèi)型屬性。
@取值可以為none,interactive,on-drag。
@決定了滑動(dòng)列表中某一組件呼出了軟鍵盤(pán),是否允許通過(guò)拉軟鍵盤(pán)這一動(dòng)作讓軟鍵盤(pán)消失。
1.1、none是不允許
1.2、on-drag:表示在手勢(shì)開(kāi)始的時(shí)候,軟鍵盤(pán)會(huì)消失。
1.3、interactive:表示鍵盤(pán)消失的動(dòng)畫(huà)會(huì)與手勢(shì)交互對(duì)應(yīng),若用戶向上拉,則軟鍵盤(pán)不會(huì)消失。

注意:Android操作系統(tǒng)只支持none

4、onContentSizeChange:是一個(gè)回調(diào)函數(shù),當(dāng)承載ScrollView的父組件的寬高發(fā)生改變的時(shí)候會(huì)調(diào)用該方法。

5、onScroll:回調(diào)函數(shù),在滑動(dòng)時(shí)調(diào)用。

6、pagingEnable:布爾類(lèi)型,默認(rèn)false,當(dāng)為true時(shí),滑動(dòng)組件中顯示的內(nèi)容在劃過(guò)整數(shù)倍的寬高后會(huì)停止滑動(dòng),適合用來(lái)實(shí)現(xiàn)水平方向整頁(yè)滑動(dòng),類(lèi)似電子書(shū)界面。

7、scrollEnabled:布爾類(lèi)型,為false時(shí),將不能滑動(dòng)。

8、showsHorizontalScrollIndicator與showsVerticalScrollIndicator:分別表示是否顯示水平與垂直的滑動(dòng)指示器,為布爾類(lèi)型。

1.2 ScrollViiew組件Android專(zhuān)有屬性

endFillColor: 為顏色類(lèi)型的屬性,如果ScrollView組件的寬高大于它的內(nèi)容所需寬高,那么剩余的空間會(huì)渲染為指定的顏色。

1.3 ScrollView組件的公開(kāi)函數(shù)

scrollTo函數(shù):

數(shù)據(jù)結(jié)構(gòu):

{
x: aNumber, //橫坐標(biāo)
y:aNumber, //縱坐標(biāo)
animated:aBool//是否需要?jiǎng)赢?huà)效果
}

調(diào)用形式:aScroll.scrollTo({放入?yún)?shù)});

1.4 RefreshControl組件(下拉刷新)

該組件專(zhuān)門(mén)為ScrollView服務(wù),當(dāng)ScrollView拉動(dòng)到頂部的時(shí)候,如果給該組件賦予一個(gè)RefreshControl組件,那么就會(huì)顯示這個(gè)組件,就類(lèi)似于下拉刷新組件,可以在此時(shí)請(qǐng)求網(wǎng)絡(luò)做數(shù)據(jù)更新操作。
onRefresh: 當(dāng)ScrollView拉到頂部時(shí)候,調(diào)用該方法。
refreshing: 布爾類(lèi)型,當(dāng)前是否刷新控制并顯示刷新組件。

e.g.

<ScrollView style={styles.scrollView} onScroll={this.onScroll} 
                  refreshControl={
                    <RefreshControl refreshing={true}
                                    onRefresh={this._onRefresh}
                                    tintColor="#ff0000"
                                    title="加載中……"
                                    colors={['#ff0000','#00ff00','#0000ff']}
                                    progressBackgroundColor="#ffff00"/>
                  }>
</ScrollView>

1.4.1 Android平臺(tái)特有的RefreshControl屬性:

1、colors: 數(shù)組類(lèi)型,用來(lái)指定刷新指示器的顏色,可以顏色變換。
2、enabled:是否打開(kāi)刷新功能,為布爾類(lèi)型。
3、progressBackgroundColor: 顏色類(lèi)型,用于指定刷新指示器的背景顏色。
4、size: 為RefreshLayoutConsts.SIZE屬性,用于指定刷新指示器的大小,默認(rèn)為DEFAULT。

2、ListView組件

2.1 ListView組件的回調(diào)函數(shù)

1、onEndReached: 在ListView所有行都被渲染到屏幕上,并且列表被滑動(dòng)到底部時(shí)候調(diào)用,無(wú)參無(wú)返回值。
2、renderFooter: 用來(lái)渲染列表底部,不接受任何參數(shù),需要返回一個(gè)renderable組件,每一次重新渲染會(huì)調(diào)用一次。
3、renderHeader: 渲染首部,同上。
4、renderRow: 回調(diào)函數(shù),渲染列表的每一行,接收四個(gè)參數(shù),rowData、sectionID、rowID、highlightRow,并需要返回一個(gè)可渲染對(duì)象,四個(gè)參數(shù)分別為數(shù)據(jù)、數(shù)據(jù)ID、行號(hào)以及一個(gè)高亮顯示某行的回調(diào)函數(shù),但該函數(shù)在如今的RN當(dāng)中還未被實(shí)現(xiàn)。
5、renderScrollComponent: 提供一個(gè)可滑動(dòng)組件供List在其中渲染,默認(rèn)返回一個(gè)ScrollView組件。
6、renderSectionHeader: 用于渲染某一節(jié)的頭部,接收sectionData與sectionID,并返回一個(gè)可渲染組件。
7、renderSeparator: 用來(lái)在每一行下面(但如果下一行是另一節(jié)的開(kāi)頭則不會(huì)渲染)渲染一個(gè)分割單元,接收sectionID,rowID與adjacentRowHighlighted三個(gè)參數(shù),返回可渲染組件。
8、onChangeVisibleRows: 回調(diào)函數(shù),用于通知哪些行已經(jīng)是可見(jiàn)行,哪些行的可見(jiàn)性已經(jīng)改變,接收兩個(gè)參數(shù):visibleRows,changedRows,無(wú)需返回值,visibleRows是一個(gè)map結(jié)構(gòu),格式為{sectionID:{rowID:true|false}},changedRows同樣如此,為true時(shí)可見(jiàn),反之不可見(jiàn)。

2.2 其他屬性

1、dataSource: 是一個(gè)ListViewDataSource類(lèi)型,用來(lái)描述列表數(shù)據(jù)來(lái)源。
2、 initialListSize: 定義有多少行會(huì)在掛接時(shí)被渲染。
3、onEndReachedThreshold:數(shù)值類(lèi)型屬性,需要結(jié)合onEndReached回調(diào)函數(shù)使用,以pt為單位。
4、pageSize: 數(shù)值類(lèi)型,默認(rèn)值為1,即在每一次消息循環(huán)中只有一行會(huì)被渲染。
5、removeClippedSubviews:布爾類(lèi)型,無(wú)默認(rèn)值,為true時(shí),RN將會(huì)對(duì)在屏幕以外的元素不進(jìn)行計(jì)算而提高滑動(dòng)流暢度,該函數(shù)仍處在實(shí)驗(yàn)階段。需要配合view中添加overflow:hidden實(shí)現(xiàn)。

e.g.

//聲明DataSource的狀態(tài)機(jī)變量:
this.state={
      diaryListDataSource:new ListView.DataSource({rowHasChanged:(oldRow,newRow)=>{
        oldRow!==newRow;
      }})

//將數(shù)據(jù)源中的數(shù)據(jù)復(fù)制到DataSource中:
componentWillMount(){
    if(this.props.diaryList===null){
      return;
    }
    this.setState({
      diaryListDataSource:this.state.diaryListDataSource.cloneWithRows(this.props.diaryList)
    });
  }

  componentWillReceiveProps(nextProps){//這個(gè)函數(shù)很重要
    this.setState({
      diaryListDataSource:this.state.diaryListDataSource.cloneWithRows(nextProps.diaryList)//注意這里的nextProps.diaryList
    });
  }

//列表組件
{/*這里使用一個(gè)三元表達(dá)式進(jìn)行判斷*/}
      {
        (
          (this.props.diaryList.length!==0)?
          (
            <ListView dataSource={this.state.diaryListDataSource} renderRow={this.renderListItem}>
            </ListView>
          ):(
            <View style={{flex:1,justifyContent:'center'}}>
            <Text style={{fontSize:18}}></Text>
            </View>
          )
        )
      }

注意:ListView.DataSource類(lèi)型的變量必須放置在集成React框架的Component組件的組建中生成。

2.3 列表的高級(jí)處理

1、可以將列表的每一行通過(guò)可觸摸組件包裹,保證良好的UI交互效果。
2、可以在每一列中定義多個(gè)可觸摸組件。

2.4 列表分段

2.4.1 聲明狀態(tài)機(jī)變量

//在構(gòu)造函數(shù)中
狀態(tài)機(jī)變量名:new ListView.DataSource({
rowHasChanged:(oldRow,newRow)=>{oldRow!==newRow},
sectionHeaderHasChanged:(oldSH,newSH)=>oldSH!==newSH
})

2.4.2 將數(shù)據(jù)源復(fù)制到DataSource中

let newListWithSection=[];
let sec1="分區(qū)1";
let sec2="分區(qū)2";
newListWithSection[sec1]=this.list;
newListWithSection[sec2]=this.list;
let fakeSections=[sec1,sec2];

this.setState(()=>{
return {listDS:this.state.listDS.closeWithRowsAndSections(newListWithSection,fakeSections)};
});

2.4.3 定義分欄、首尾欄以及列表間隔渲染:

renderSectionHeader(sectionData,sectionID);
renderHeader();
renderFooter();
renderSeparator();

<ListView 
       dataSource={this.props.dataSource}
       renderRow={}
       renderSectionHeader={}
       renderSeparator={}
       renderHeader={}
       renderFooter={}/>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,142評(píng)論 4 61
  • 目擊眾神死亡的草原上野花一片 遠(yuǎn)在遠(yuǎn)方的風(fēng)比遠(yuǎn)方更遠(yuǎn) 我的琴聲嗚咽淚水全無(wú) 我把這遠(yuǎn)方的遠(yuǎn)歸還草原 一個(gè)叫木...
    宜紹閱讀 804評(píng)論 0 0
  • 初夏,西安城南一老街道邊,熱鬧喧囂的燒烤攤上,男主角和幾位朋友正在喝酒擼串… “還能接著喝嗎?”我說(shuō)。 “一人再開(kāi)...
    長(zhǎng)安誅客閱讀 324評(píng)論 0 1
  • 穿上白雪婚紗 ——便開(kāi)始接近一個(gè)母親的樣子 接近一個(gè)家的和睦,或者破毀 一個(gè)人的狂喜,渴望以及瘋狂 你試圖溫和的走...
    屋頂有故事的貓閱讀 249評(píng)論 4 11

友情鏈接更多精彩內(nèi)容