最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

antd-mobile ListView長列表的數(shù)據更新遇到的坑

 更新時間:2020年04月08日 11:19:45   作者:養(yǎng)豬大戶  
這篇文章主要介紹了antd-mobile ListView長列表的數(shù)據更新遇到的坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

遇到的問題

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

解決列表不刷新問題

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

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

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

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

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

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

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

ListView在實際項目中使用

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

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

  this.state = {
   dataSource,
  };
 }

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

 // 在這里維護長列表數(shù)據,把從接口獲取來的數(shù)據賦值給state里的dataSource。
 componentWillReceiveProps(nextProps) {
  if(nextProps.message.commentList !== this.props.message.commentList){
   this.setState({
   // 注意!這里的cloneWithRows(),antd里規(guī)定用它來更新dataSource,這個不是拼接數(shù)據,用這個函數(shù),dataSource會更新成nextProps.message.commentList。
   //所以在接受后端分頁數(shù)據時,就把拼接好的數(shù)據賦值給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) {
    // 長列表,上一次頁的數(shù)據+這次的數(shù)據,賦值給新的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長列表的數(shù)據更新遇到的坑的詳細內容,更多關于antd-mobile ListView長列表的資料請關注腳本之家其它相關文章!

相關文章

  • json_decode 索引為數(shù)字時自動排序問題解決方法

    json_decode 索引為數(shù)字時自動排序問題解決方法

    這篇文章主要介紹了使用son_encode 給前端返回數(shù)據,結果順序不對,經debug調試,發(fā)現(xiàn)是json_encode 函數(shù)的問題,變成 " " + 數(shù)字即可,需要的朋友可以參考下
    2020-03-03
  • 原生js實現(xiàn)購物車邏輯和功能

    原生js實現(xiàn)購物車邏輯和功能

    這篇文章主要為大家詳細介紹了原生js實現(xiàn)購物車邏輯和功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • webpack4之SplitChunksPlugin使用指南

    webpack4之SplitChunksPlugin使用指南

    這篇文章主要介紹了webpack4之SplitChunksPlugin使用指南,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 使用base64對圖片的二進制進行編碼并用ajax進行顯示

    使用base64對圖片的二進制進行編碼并用ajax進行顯示

    這篇文章主要介紹了使用base64對圖片的二進制進行編碼并用ajax進行顯示的相關資料,需要的朋友可以參考下
    2017-01-01
  • JS跨域請求的問題解析

    JS跨域請求的問題解析

    在本篇內容里小編給大家整理了關于解決JS跨域請求的問題知識點,需要的朋友們參考學習下。
    2018-12-12
  • 淺談webpack 自動刷新與解析

    淺談webpack 自動刷新與解析

    這篇文章主要介紹了淺談webpack 自動刷新與解析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • javascript宿主對象之window.navigator詳解

    javascript宿主對象之window.navigator詳解

    這篇文章主要為大家詳細介紹了javascript宿主對象之window.navigator,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 簡單的js表格操作

    簡單的js表格操作

    這篇文章主要為大家詳細介紹了簡單的js表格操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 前端在線預覽PDF文件三種實現(xiàn)方式(兼容移動端)

    前端在線預覽PDF文件三種實現(xiàn)方式(兼容移動端)

    這篇文章主要介紹了前端在線預覽PDF文件三種實現(xiàn)方式的相關資料,分別是使用微軟在線預覽地址、直接使用window.open打開文檔鏈接以及使用PDF.js,PDF.js方法穩(wěn)定,適用于大多數(shù)文件,每種方法都給出了詳細的代碼示例,需要的朋友可以參考下
    2025-02-02
  • JS交換變量的方法

    JS交換變量的方法

    這篇文章主要介紹了JS交換變量的方法,實例分析了javascript通過自定義函數(shù)實現(xiàn)變量交換的使用技巧,需要的朋友可以參考下
    2015-01-01

最新評論

察隅县| 子长县| 且末县| 临安市| 津南区| 越西县| 莱阳市| 鱼台县| 霍城县| 曲水县| 潮州市| 津市市| 左云县| 大埔县| 左贡县| 淅川县| 博客| 讷河市| 车致| 富蕴县| 平和县| 岑溪市| 新乡市| 上思县| 阿拉善左旗| 墨脱县| 务川| 揭东县| 石城县| 确山县| 彭水| 本溪市| 十堰市| 准格尔旗| 眉山市| 房山区| 神池县| 土默特右旗| 咸丰县| 色达县| 富锦市|