详解mpvue scroll-view自动回弹bug解决方案


Posted in Javascript onOctober 01, 2018

表现

设置了scroll-top的scroll-view组件,在组件所在vue实例data发生改变时会自动回弹到最上方

解决方案

打开 node_modules/mpvue/index.js, 在任意位置添加以下两个方法

function calcDiff(holder, key, newObj, oldObj) {
 if (newObj === oldObj || newObj === undefined) {
  return
 }

 if (newObj == null || oldObj == null || typeof newObj !== typeof oldObj) {
  holder[key] = newObj
 } else if (Array.isArray(newObj) && Array.isArray(oldObj)) {
  if (newObj.length === oldObj.length) {
   for (var i = 0, len = newObj.length; i < len; ++i) {
    calcDiff(holder, key + '[' + i + ']', newObj[i], oldObj[i])
   }
  } else {
   holder[key] = newObj
  }
 } else if (typeof newObj === 'object' && typeof oldObj === 'object') {
  var newKeys = Object.keys(newObj)
  var oldKeys = Object.keys(oldObj)

  if (newKeys.length !== oldKeys.length) {
   holder[key] = newObj
  } else {
   var allKeysSet = Object.create(null)
   for (var i = 0, len = newKeys.length; i < len; ++i) {
    allKeysSet[newKeys[i]] = true
    allKeysSet[oldKeys[i]] = true
   }
   if (Object.keys(allKeysSet).length !== newKeys.length) {
    holder[key] = newObj
   } else {
    for (var i = 0, len = newKeys.length; i < len; ++i) {
     var k = newKeys[i]
     calcDiff(holder, key + '.' + k, newObj[k], oldObj[k])
    }
   }
  }
 } else if (newObj !== oldObj) {
  holder[key] = newObj
 }
}

function diff(newObj, oldObj) {
 var keys = Object.keys(newObj)
 var diffResult = {}
 for (var i = 0, len = keys.length; i < len; ++i) {
  var k = keys[i]
  var oldKeyPath = k.split('.')
  var oldValue = oldObj[oldKeyPath[0]]
  for (var j = 1, jlen = oldKeyPath.length; j < jlen && oldValue !== undefined; ++j) {
   oldValue = oldValue[oldKeyPath[j]]
  }
  calcDiff(diffResult, k, newObj[k], oldValue)
 }
 return diffResult
}

2.找到 throttleSetData 修改为

var throttleSetData = throttle(function (page, data) {
 page.setData(diff(data, page.data));
}, 50);

3.找到 updateDataToMP 方法, 将 throttleSetData 的调用方式改为

throttleSetData(page, data);

希望官方早日修复,参考:

使用脏检查优化每次更新数据时都会传输大量数据的问题, 解决删除回退, 列表忽然滚动到顶部等问题

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
兼容FF和IE的动态table示例自写
Oct 21 Javascript
jQuery学习笔记之2个小技巧
Jan 19 Javascript
有关JavaScript中call()和apply() 的一些理解
May 20 Javascript
jQuery多级联动下拉插件chained用法示例
Aug 20 Javascript
AngularJS中的DOM操作用法分析
Nov 04 Javascript
JS实现中国公民身份证号码有效性验证
Feb 20 Javascript
Vue 实现列表动态添加和删除的两种方法小结
Sep 07 Javascript
详解js创建对象的几种方法及继承
Apr 12 Javascript
详解Vue调用手机相机和相册以及上传
May 05 Javascript
webgl实现物体描边效果的方法介绍
Nov 27 Javascript
javascript运行机制之执行顺序理解
Aug 03 Javascript
Javascript异步流程控制之串行执行详解
Sep 27 Javascript
在create-react-app中使用sass的方法示例
Oct 01 #Javascript
详解mpvue小程序中怎么引入iconfont字体图标
Oct 01 #Javascript
Vue 组件封装 并使用 NPM 发布的教程
Sep 30 #Javascript
浅谈angular表单提交中ng-submit的默认使用方法
Sep 30 #Javascript
angularJs中$scope数据序列化的实例
Sep 30 #Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
Sep 30 #Javascript
mpvue项目中使用第三方UI组件库的方法
Sep 30 #Javascript
You might like
php $_SERVER当前完整url的写法
2009/11/12 PHP
php过滤XSS攻击的函数
2013/11/12 PHP
PHP实现的博客欢迎提示功能(很特别哦)
2014/06/05 PHP
PHP5.3安装Zend Guard Loader图文教程
2014/09/29 PHP
跟我学Laravel之请求与输入
2014/10/15 PHP
thinkPHP中验证码的简单使用方法
2015/12/26 PHP
PHP Filter过滤器全面解析
2016/08/09 PHP
Ext面向对象开发实践(续)
2008/11/18 Javascript
InnerHtml和InnerText的区别分析
2009/03/13 Javascript
JS学习之一个简易的日历控件
2010/03/24 Javascript
jQuery EasyUI API 中文文档 - EasyLoader 加载器
2011/09/29 Javascript
javascript的动态加载、缓存、更新以及复用(一)
2014/06/09 Javascript
Javascript Memoizer浅析
2014/10/16 Javascript
javascript弹出窗口实现代码
2015/11/12 Javascript
基于javascript实现精确到毫秒的倒计时限时抢购
2016/04/17 Javascript
基于jQuery和CSS3实现APPLE TV海报视差效果
2017/06/16 jQuery
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
Python字符串和文件操作常用函数分析
2015/04/08 Python
TensorFlow tf.nn.max_pool实现池化操作方式
2020/01/04 Python
多个python文件调用logging模块报错误
2020/02/12 Python
python 生成任意形状的凸包图代码
2020/04/16 Python
python 错误处理 assert详解
2020/04/20 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
2020/04/23 Python
怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返回 指向字符的指针的函数的指针的数组?
2013/03/19 面试题
大学生职业生涯规划范文——找准自我,定位人生
2014/01/23 职场文书
暑期社会实践感言
2014/02/25 职场文书
离职保密承诺书
2014/05/28 职场文书
暑期工社会实践报告
2015/07/13 职场文书
2016年社区创先争优活动总结
2016/04/05 职场文书
接收函
2019/04/22 职场文书
2019年朋友圈经典励志语录50条
2019/07/05 职场文书
Python中requests做接口测试的方法
2021/05/30 Python
Python基本知识点总结
2022/04/07 Python
centos环境下nginx高可用集群的搭建指南
2022/07/23 Servers