本篇內容主要講解“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。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯