antd-mobile ListView长列表的数据更新遇到的坑


Posted in Javascript onApril 08, 2020

遇到的问题

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-mobile ListView长列表的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
JavaScript对象链式操作代码(jquery)
Jul 04 Javascript
kmock javascript 单元测试代码
Feb 06 Javascript
判断iframe里的页面是否加载完成
Jun 06 Javascript
JavaScript数组去重的五种方法
Nov 05 Javascript
JavaScript jquery及AJAX小结
Jan 24 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
Mar 24 Javascript
D3.js实现直方图的方法详解
Sep 25 Javascript
vue使用Axios做ajax请求详解
Jun 07 Javascript
深入理解Vuex 模块化(module)
Sep 26 Javascript
一秒学会微信小程序制作table表格
Feb 14 Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
Jun 10 Javascript
详解element-ui设置下拉选择切换必填和非必填
Jun 17 Javascript
详解element上传组件before-remove钩子问题解决
Apr 08 #Javascript
javascript 设计模式之享元模式原理与应用详解
Apr 08 #Javascript
javascript 设计模式之组合模式原理与应用详解
Apr 08 #Javascript
JS async 函数的含义和用法实例总结
Apr 08 #Javascript
微信小程序以ssm做后台开发的实现示例
Apr 08 #Javascript
JS co 函数库的含义和用法实例总结
Apr 08 #Javascript
JS Thunk 函数的含义和用法实例总结
Apr 08 #Javascript
You might like
深入了解php4(1)--回到未来
2006/10/09 PHP
PHP实现下载断点续传的方法
2014/11/12 PHP
php中将一个对象保存到Session中的方法
2015/03/13 PHP
php实现上传图片文件代码
2015/07/19 PHP
PHP运用foreach神奇的转换数组(实例讲解)
2018/02/01 PHP
javascript打印大全(打印页面设置/打印预览代码)
2013/03/29 Javascript
jquery ajax修改全局变量示例代码
2013/11/08 Javascript
浅谈javascript中createElement事件
2014/12/05 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
jQuery插件 Jqplot图表实例
2016/06/18 Javascript
jQuery表单事件实例代码分享
2016/08/18 Javascript
JS版微信6.0分享接口用法分析
2016/10/13 Javascript
基于jQuery实现火焰灯效果导航菜单
2017/01/04 Javascript
微信小程序 页面跳转如何实现传值
2017/04/05 Javascript
vue中接口域名配置为全局变量的实现方法
2018/09/20 Javascript
如何使用pm2快速将项目部署到远程服务器
2019/03/12 Javascript
在Vue.js中使用TypeScript的方法
2020/03/19 Javascript
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
浅谈Ant Design Pro 菜单自定义 icon
2020/11/17 Javascript
[01:13:59]LGD vs Mineski Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
tornado框架blog模块分析与使用
2013/11/21 Python
Python OpenCV处理图像之滤镜和图像运算
2018/07/10 Python
使用python Fabric动态修改远程机器hosts的方法
2018/10/26 Python
python/Matplotlib绘制复变函数图像教程
2019/11/21 Python
Python类和实例的属性机制原理详解
2020/03/21 Python
python 密码学示例——凯撒密码的实现
2020/09/21 Python
HTML5 背景的显示区域实现
2020/07/09 HTML / CSS
拉飞逸官网:Lafayette 148 New York
2020/07/15 全球购物
婚前协议书
2014/04/15 职场文书
节约用电通知
2015/04/25 职场文书
团组织推荐意见
2015/06/05 职场文书
Python Pandas pandas.read_sql_query函数实例用法分析
2021/06/21 Python
Win11电源已接通但未充电怎么办?Win11电源已接通未充电的解决方法
2022/04/05 数码科技