好用的ReactNative下拉刷新上拉加載的組件黑低,支持iOS和Android

之前寫iOS時赘艳,有這非常好用的下拉刷新和上拉加載的組件如MJReferesh這樣優(yōu)秀的組件酌毡,但是最近寫ReactNative時,一直沒發(fā)現(xiàn)非常如意的第三方下拉刷新的組件蕾管,所以便自己寫了一個簡單好用的刷新組件react-native-swRefresh枷踏,支持scrollView,ListView,支持自定義。支持iOS和Android


更新Android支持 實(shí)現(xiàn)方式不一樣 所以Android體驗(yàn)可能稍微有點(diǎn)不同

新增beginRefresh()和endRefresh()方法來手動調(diào)用下拉刷新和結(jié)束下拉刷新 類iOS中的MJRefrsh

新增endLoadMore() 結(jié)束上拉加載 代替end()回調(diào) 同樣可以傳入bool參數(shù)代表這次結(jié)束是否進(jìn)入已無更多狀態(tài)掰曾。

因?yàn)閯偨佑|旭蠕,所以也寫不出非常優(yōu)美的代碼,改著改著就有點(diǎn)冗余了,有空就優(yōu)化下旷坦,但是個人覺的應(yīng)該是很好用的組件掏熬,這篇文章主要是介紹其如何使用:

  • 安裝:

      npm install react-native-swRefresh
    
  • 使用:

    • 引入
//根據(jù)需要引入
import {
  SwRefreshScrollView, //支持下拉刷新的ScrollView
  SwRefreshListView, //支持下拉刷新和上拉加載的ListView
  RefreshStatus, //刷新狀態(tài) 用于自定義下拉刷新視圖時使用
  LoadMoreStatus //上拉加載狀態(tài) 用于自定義上拉加載視圖時使用
} from 'react-native-swRefresh'

具體屬性和方法 github上有介紹

  1. 簡單使用(兩個組件下拉刷新的使用方法是一樣的,本文以SwRefreshListView為例)
_page = 0
_dataSource = new ListView.DataSource({rowHasChanged:(row1,row2)=>row1 !== row2})

// 構(gòu)造
constructor(props) {
  super(props);
  // 初始狀態(tài)
  this.state = {
    dataSource:this._dataSource.cloneWithRows([0,1,2,3,4,5,6,7,8,9,0])
  };
}
render(){
  return this._renderListView() // ListView Demo
}

_renderListView(){
return(
  <SwRefreshListView
    dataSource={this.state.dataSource}
    ref="listView"
    renderRow={this._renderRow.bind(this)} 
    onRefresh={this._onListRefersh.bind(this)}//設(shè)置下拉刷新的方法 傳遞參數(shù)end函數(shù) 當(dāng)刷新操作結(jié)束時 
    onLoadMore={this._onLoadMore.bind(this)} //設(shè)置上拉加載執(zhí)行的方法 傳遞參數(shù)end函數(shù) 當(dāng)刷新操作結(jié)束時 end函數(shù)可接受一個bool值參數(shù)表示刷新結(jié)束后是否已經(jīng)無更多數(shù)據(jù)了秒梅。
    //isShowLoadMore={false} //可以通過state控制是否顯示上拉加載組件旗芬,可用于數(shù)據(jù)不足一屏或者要求數(shù)據(jù)全部加載完畢時不顯示上拉加載控件
    
    customRefreshView={(refresStatus,offsetY)=>{
        return (<Text>{'狀態(tài):'+refresStatus+','+offsetY}</Text>)
    }} //自定義下拉刷新視圖參數(shù),refresStatus是上面引入的RefreshStatus類型捆蜀,對應(yīng)刷新狀態(tài)各個狀態(tài)疮丛。offsetY對應(yīng)下拉的偏移量,可用于定制動畫。自定義視圖必須通過customRefreshViewHeight指定高度
    
    customRefreshViewHeight={100} //自定義刷新視圖時必須指定高度
    
  />)
}
  /**
 * 模擬刷新
 * @param end
 * @private
 */
_onListRefersh(end){
  let timer =  setTimeout(()=>{
    console.log('刷新成功')
    clearTimeout(timer)
    this._page=0
    let data = []
    for (let i = 0;i<10;i++){
      data.push(i)
    }
    this.setState({
      dataSource:this._dataSource.cloneWithRows(data)
    })
  
    //推薦以下寫法 用戶體驗(yàn)更好 
    if(已加載全部數(shù)據(jù)){   
          //如果此時刷新的數(shù)據(jù)就已經(jīng)是全部數(shù)據(jù)了漱办,不管怎樣都應(yīng)該將上拉加載組件設(shè)置為沒有更多數(shù)據(jù)了的狀態(tài) 或者通過isShowLoadMore控制其隱藏
        this.refs.listView.setNoMoreData() //設(shè)置為沒有更多數(shù)據(jù)了的狀態(tài)  
          }else{
            //這里調(diào)用resetStatus來重置上拉加載的狀態(tài) 因?yàn)榇饲翱缮侠虞d組件的狀態(tài)可能已經(jīng)是無更多數(shù)據(jù)了 所以進(jìn)行狀態(tài)重置 亦可以通     過state控制isShowLoadMore來控制顯示上拉加載視圖
        this.refs.listView.resetStatus() //重置上拉加載的狀態(tài)
        }
    //如果不這么寫 上拉一次后 上拉組件也會獲知正確的狀態(tài)
    
    end()//刷新成功后需要調(diào)用end結(jié)束刷新 不管成功或者失敗都應(yīng)該結(jié)束
    / / this.refs.listView.endRefresh() //新增方法 結(jié)束刷新 建議使用end() 这刷。當(dāng)然這個可以在任何地方使用
  },1500)
}
  /**
 * 模擬加載更多
 * @param end
 * @private
 */
_onLoadMore(end){
  let timer =  setTimeout(()=>{
    clearTimeout(timer)
    this._page++
    let data = []
    for (let i = 0;i<(this._page+1)*10;i++){
      data.push(i)
    }
    this.setState({
      dataSource:this._dataSource.cloneWithRows(data)
    })
  
    let isNoMore = this._page > 2 //是否已無更多數(shù)據(jù)
    //結(jié)束 
    end(isNoMore)// 假設(shè)加載4頁后數(shù)據(jù)全部加載完畢 加載成功后需要調(diào)用end結(jié)束刷新   

  },2000)
}
componentDidMount() {
   let timer = setTimeout(()=>{
     clearTimeout(timer)
      this.refs.listView.beginRefresh()
    },500) //自動調(diào)用開始刷新 新增方法
 }
/*--tip--:如果刷新和加載在同一個方法里婉烟,對于傳遞的參數(shù)end()函數(shù)無需區(qū)分娩井。
onRefresh中的end()函數(shù) 中接受參數(shù)沒有任何關(guān)系 只要調(diào)用end()函數(shù)就會結(jié)束刷新或加載*/

演示:

image
image

image
image

image
image

image
image

啰嗦了這么多,希望能給大家提供方便似袁,如果覺得好用的話給個star,謝謝洞辣!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市昙衅,隨后出現(xiàn)的幾起案子扬霜,更是在濱河造成了極大的恐慌,老刑警劉巖而涉,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件著瓶,死亡現(xiàn)場離奇詭異材原,居然都是意外死亡季眷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人担钮,你說我怎么就攤上這事裳朋∠胖” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诫肠。 經(jīng)常有香客問我欺缘,道長,這世上最難降的妖魔是什么丧鸯? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任嫩絮,我火速辦了婚禮,結(jié)果婚禮上蜂怎,老公的妹妹穿的比我還像新娘置尔。我一直安慰自己,他們只是感情好榜轿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布差导。 她就那樣靜靜地躺著,像睡著了一般颠蕴。 火紅的嫁衣襯著肌膚如雪犀被。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機(jī)與錄音员舵,去河邊找鬼藕畔。 笑死注服,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的溶弟。 我是一名探鬼主播辜御,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼鸭你,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了苇本?” 一聲冷哼從身側(cè)響起袜茧,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎笛厦,沒想到半個月后纳鼎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裳凸,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贱鄙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了姨谷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逗宁。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡梦湘,死狀恐怖瞎颗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情引有,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布曾我,位于F島的核電站,受9級特大地震影響健民,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一凤优、第九天 我趴在偏房一處隱蔽的房頂上張望悦陋。 院中可真熱鬧,春花似錦筑辨、人聲如沸俺驶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽暮现。三九已至,卻和暖如春楚昭,著一層夾襖步出監(jiān)牢的瞬間栖袋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工抚太, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留塘幅,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓尿贫,卻偏偏與公主長得像电媳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子庆亡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

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