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 相关文章推荐
制作特殊字的脚本
Jun 26 Javascript
js 动态加载事件的几种方法总结
Dec 25 Javascript
JS延迟加载加快页面打开速度示例代码
Dec 30 Javascript
JavaScript不使用prototype和new实现继承机制
Dec 29 Javascript
原生JS取代一些JQuery方法的简单实现
Sep 20 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
Mar 09 Javascript
手把手教你vue-cli单页到多页应用的方法
May 31 Javascript
layer弹出层全屏及关闭方法
Aug 17 Javascript
解决Angular2 router.navigate刷新页面的问题
Aug 31 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
Jun 10 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
Aug 12 Javascript
在vue中使用vant TreeSelect分类选择组件操作
Nov 02 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
PHP提示Notice: Undefined variable的解决办法
2012/11/24 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
2016/08/01 PHP
php版微信自定义回复功能示例
2016/12/05 PHP
PHP基于ip2long实现IP转换整形
2020/12/11 PHP
插件:检测javascript的内存泄漏
2007/03/04 Javascript
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
JavaScript DOM 学习第三章 内容表格
2010/02/19 Javascript
Jquery实现三层遍历删除功能代码
2013/04/23 Javascript
extjs render 用法介绍
2013/09/11 Javascript
JS连接SQL数据库与ACCESS数据库的方法实例
2013/11/21 Javascript
Google Dart编程语法和基本类型学习教程
2013/11/27 Javascript
JavaScript实现在标题栏上显示当前日期的方法
2015/03/19 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
2016/07/01 Javascript
JS转换HTML转义符的方法
2016/08/24 Javascript
JS实现微信弹出搜索框 多条件查询功能
2016/12/13 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
2017/06/21 Javascript
vue表单绑定实现多选框和下拉列表的实例
2017/08/12 Javascript
详解Angular2学习笔记之Html属性绑定
2018/01/03 Javascript
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
2018/09/28 Javascript
QRCode.js二维码生成并能长按识别
2018/10/16 Javascript
vue-路由精讲 二级路由和三级路由的作用
2020/08/06 Javascript
python写入中英文字符串到文件的方法
2015/05/06 Python
详解Python多线程
2016/11/14 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
2017/01/18 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
python实现泊松图像融合
2018/07/26 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
2019/08/12 Python
PatPat德国:妈妈的每日优惠
2019/10/02 全球购物
政府法律服务方案
2014/06/14 职场文书
庆祝国庆节演讲稿2014
2014/09/19 职场文书
学校办公室主任岗位职责
2015/04/01 职场文书
2016年“六一儿童节”校园广播稿
2015/12/17 职场文书
3招让你摆脱即兴讲话冷场尴尬
2019/08/08 职场文书
JavaScript canvas实现流星特效
2021/05/20 Javascript
Java Dubbo框架知识点梳理
2021/06/26 Java/Android
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL