antd-mobile ListView長列表的數(shù)據(jù)更新遇到的坑
遇到的問題
listView這個組件我真的是看文檔看得腦殼疼。好不容易看文檔寫完長列表數(shù)據(jù)展示了。然后遇到一個需求,即用戶有一個點贊操作,問題出現(xiàn)了,點贊完數(shù)據(jù)更新之后listView不刷新列表。
解決列表不刷新問題
官方的demo里有這么一個函數(shù) rowHasChanged ,這個函數(shù)返回true或者false,如果是true,則認為這行數(shù)據(jù)改變了,然后刷新這行數(shù)據(jù),也就更新了列表。
// 官方
constructor(props) {
super(props);
...
const dataSource = new ListView.DataSource({
...
rowHasChanged: (row1, row2) => row1 !== row2 // 這個方法
});
}
然后就各種百度,最后在github上看到這個 issue。最后大家得出的結(jié)論就是如果要繼續(xù)用這個組件,又想刷新列表的話就只能寫成下面這樣。
but,這樣寫會讓所有的數(shù)據(jù)都更新,對性能的消耗挺大的。
// !!!這樣寫 rowHasChanged: ( row1, row2) => true
emmm,但是我不想去看其他的插件了,所以就采用了上面的寫法。
下面就講一下我怎么配置這個listView的,因為我覺得這個組件官方demo還真的寫得蠻看不懂的。
ListView在實際項目中使用
下面的代碼主要展示怎么配置listview,不要扣小地方,因為我把很多業(yè)務(wù)代碼去掉了。
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ù)據(jù)
}
// 在這里維護長列表數(shù)據(jù),把從接口獲取來的數(shù)據(jù)賦值給state里的dataSource。
componentWillReceiveProps(nextProps) {
if(nextProps.message.commentList !== this.props.message.commentList){
this.setState({
// 注意!這里的cloneWithRows(),antd里規(guī)定用它來更新dataSource,這個不是拼接數(shù)據(jù),用這個函數(shù),dataSource會更新成nextProps.message.commentList。
//所以在接受后端分頁數(shù)據(jù)時,就把拼接好的數(shù)據(jù)賦值給nextProps.message.commentList(這個在model.js里寫了)
dataSource: this.state.dataSource.cloneWithRows(nextProps.message.commentList),
});
}
}
// onEndReached,列表被滾動到距離最底部不足`onEndReachedThreshold`個像素的距離時調(diào)用
// 在這里寫分頁請求
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ù)據(jù)+這次的數(shù)據(jù),賦值給新的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ù)據(jù)更新遇到的坑的詳細內(nèi)容,更多關(guān)于antd-mobile ListView長列表的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
json_decode 索引為數(shù)字時自動排序問題解決方法
這篇文章主要介紹了使用son_encode 給前端返回數(shù)據(jù),結(jié)果順序不對,經(jīng)debug調(diào)試,發(fā)現(xiàn)是json_encode 函數(shù)的問題,變成 " " + 數(shù)字即可,需要的朋友可以參考下2020-03-03
webpack4之SplitChunksPlugin使用指南
這篇文章主要介紹了webpack4之SplitChunksPlugin使用指南,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06
javascript宿主對象之window.navigator詳解
這篇文章主要為大家詳細介紹了javascript宿主對象之window.navigator,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09
前端在線預(yù)覽PDF文件三種實現(xiàn)方式(兼容移動端)
這篇文章主要介紹了前端在線預(yù)覽PDF文件三種實現(xiàn)方式的相關(guān)資料,分別是使用微軟在線預(yù)覽地址、直接使用window.open打開文檔鏈接以及使用PDF.js,PDF.js方法穩(wěn)定,適用于大多數(shù)文件,每種方法都給出了詳細的代碼示例,需要的朋友可以參考下2025-02-02

