antd-mobileListView長列表的數據更新時常見問題

本篇內容主要講解“antd-mobile ListView長列表的數據更新時常見問題”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“antd-mobile ListView長列表的數據更新時常見問題”吧!

創新互聯主營達茂旗網站建設的網絡公司,主營網站建設方案,成都App制作,達茂旗h5小程序設計搭建,達茂旗網站營銷推廣歡迎達茂旗等地區企業咨詢

遇到的問題

listView這個組件我真的是看文檔看得腦殼疼。好不容易看文檔寫完長列表數據展示了。然后遇到一個需求,即用戶有一個點贊操作,問題出現了,點贊完數據更新之后listView不刷新列表。

解決列表不刷新問題

官方的demo里有這么一個函數 rowHasChanged ,這個函數返回true或者false,如果是true,則認為這行數據改變了,然后刷新這行數據,也就更新了列表。

// 官方
 constructor(props) {
  super(props);
  ...
  const dataSource = new ListView.DataSource({
   ...
   rowHasChanged: (row1, row2) => row1 !== row2 // 這個方法
  });
 }

然后就各種百度,最后在github上看到這個 issue。最后大家得出的結論就是如果要繼續用這個組件,又想刷新列表的話就只能寫成下面這樣。

but,這樣寫會讓所有的數據都更新,對性能的消耗挺大的。

// !!!這樣寫
rowHasChanged: ( row1, row2) => true

emmm,但是我不想去看其他的插件了,所以就采用了上面的寫法。

下面就講一下我怎么配置這個listView的,因為我覺得這個組件官方demo還真的寫得蠻看不懂的。

ListView在實際項目中使用

下面的代碼主要展示怎么配置listview,不要扣小地方,因為我把很多業務代碼去掉了。

class Message extends React.Component {
 constructor(props) {
  super(props);
  const dataSource = new ListView.DataSource({
  // 這樣寫,每次都執行rowHasChanged,每次都更新row
   rowHasChanged: ( row1, row2) => true
  });

  this.state = {
   dataSource,
  };
 }

 componentDidMount() {
  // 請求初始化數據
 }

 // 在這里維護長列表數據,把從接口獲取來的數據賦值給state里的dataSource。
 componentWillReceiveProps(nextProps) {
  if(nextProps.message.commentList !== this.props.message.commentList){
   this.setState({
   // 注意!這里的cloneWithRows(),antd里規定用它來更新dataSource,這個不是拼接數據,用這個函數,dataSource會更新成nextProps.message.commentList。
   //所以在接受后端分頁數據時,就把拼接好的數據賦值給nextProps.message.commentList(這個在model.js里寫了)
    dataSource: this.state.dataSource.cloneWithRows(nextProps.message.commentList),
   });
  }
 }

// onEndReached,列表被滾動到距離最底部不足`onEndReachedThreshold`個像素的距離時調用
// 在這里寫分頁請求
 onEndReached = (event) => {
  const { dispatch } = this.props;
  const { email } = this.props.user;
  const { pageNum, pageSize, contentId, totalCount, commentList } = this.props.message;
  
  let hasMore = totalCount > commentList.length ? true : false;
  // load new data
  // hasMore: from backend data, indicates whether it is the last page, here is false
  if (!hasMore) {
   return;
  }
  dispatch({
   type: "message/updateStates",
   payload: {
    pageNum: pageNum+1,
    isLoading: true,
    isLongList: true
   }
  })
  setTimeout(() => {
   dispatch({
    type: "message/getCommentsByContentId",
    payload: {
     contentId,
     identity: email, 
     pageNum: pageNum+1,
     pageSize
    }
   })
  }, 1000);
 }

 render() {
 // 列表的item
  const row = (rowData, sectionID, rowID) => {
   const item = rowData;
   return (
    <div className={styles.item} key={rowID}>
      <div onClick={toggleLike}>點贊</div>
      <div className={styles.content}>{item.content}</div>
      </div>
    </div>
   );
  };

  return (
   <Fragment>
     <ListView
     ref={el => this.lv = el}
     dataSource={this.state.dataSource}
     renderHeader={() => (
      <div className={styles.sub}>
       <span>列表頭,什么寫點什么</span>
      </div>
     )}
     renderFooter={() => (<div style={{ padding: 10, textAlign: 'center' }}>
      { isLoading ? '加載中' : '加載完畢'}
     </div>)}
     renderRow={row}
     className="am-list"
     pageSize={pageSize}
     useBodyScroll
     scrollRenderAheadDistance={500}
     onEndReached={this.onEndReached}
     onEndReachedThreshold={10}
    />
   </Fragment>
  );
 }
}

model.js

*getCommentsByContentId({ payload }, { call, put, select }) {
   const { data } = yield call(getCommentsByContentId, payload);
   const { message } = yield select(state=>state);
   const { commentList } = message;
   if (data.code === 200) {
    // 長列表,上一次頁的數據+這次的數據,賦值給新的commentList
    let list = [...commentList, ...data.data.list]
    yield put({
     type: 'updateStates',
     payload: {
      totalCount: data.data.totalCount,
      commentList: list
     }
    });
   } else {
    Toast.fail(data.msg, 1)
   }
  },

到此,相信大家對“antd-mobile ListView長列表的數據更新時常見問題”有了更深的了解,不妨來實際操作一番吧!這里是創新互聯網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

分享題目:antd-mobileListView長列表的數據更新時常見問題
文章來源:http://m.kartarina.com/article26/pihdcg.html

成都網站建設公司_創新互聯,為您提供外貿建站定制網站網站改版全網營銷推廣面包屑導航網站建設

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

h5響應式網站建設
主站蜘蛛池模板: 一本大道无码日韩精品影视_| 中文字幕无码视频手机免费看 | 国产成人亚洲综合无码| 精品韩国亚洲av无码不卡区| 久久久91人妻无码精品蜜桃HD| 久久久久亚洲AV无码麻豆| 影院无码人妻精品一区二区| 精品国产一区二区三区无码| 亚洲美日韩Av中文字幕无码久久久妻妇| 国精品无码一区二区三区在线 | 亚洲日韩精品无码专区加勒比☆| 精品成在人线AV无码免费看| 真人无码作爱免费视频| 亚洲中文字幕久久精品无码VA| 黑人无码精品又粗又大又长 | 亚洲日韩精品无码一区二区三区 | 亚洲色偷拍另类无码专区| av中文无码乱人伦在线观看| 亚洲中文字幕久久精品无码APP| 毛片无码一区二区三区a片视频 | 亚洲精品中文字幕无码A片老| 亚洲熟妇无码乱子AV电影| 午夜无码一区二区三区在线观看| 无码中文人妻在线一区 | 亚洲av无码乱码在线观看野外| 亚洲国产成人精品无码区在线网站| 亚洲中文字幕无码爆乳AV| 日韩中文无码有码免费视频| 久久久g0g0午夜无码精品| 亚洲av无码成人精品国产| 亚洲AV无码资源在线观看| 亚洲国产超清无码专区| 亚洲成无码人在线观看| 亚洲国产超清无码专区| 亚洲人成网亚洲欧洲无码| 国产精品无码一区二区在线观 | 伊人久久精品无码av一区| 亚洲熟妇无码另类久久久| 亚洲精品无码成人片在线观看| 亚洲AV无码一区二三区 | 久久伊人亚洲AV无码网站|