详解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 相关文章推荐
根据分辨率不同,调用不同的css文件
Jul 07 Javascript
jQuery在IE下使用未闭合的xml代码创建元素时的Bug介绍
Jan 10 Javascript
javascript中的delete使用详解
Apr 11 Javascript
Js日期选择器并自动加入到输入框中示例代码
Aug 02 Javascript
js解决select下拉选不中问题
Oct 14 Javascript
jQuery实现Tab菜单滚动切换的方法
Sep 21 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
Jan 07 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
Dec 14 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
Jan 10 Javascript
Vue通过配置WebSocket并实现群聊功能
Dec 31 Javascript
vue 保留两位小数 不能直接用toFixed(2) 的解决
Aug 07 Javascript
js实现石头剪刀布游戏
Oct 11 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程序的方法小结
2012/02/23 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
2015/01/30 PHP
Laravel 5框架学习之环境与配置
2015/04/08 PHP
分享PHP计算两个日期相差天数的代码
2015/12/23 PHP
php 解决扫描二维码下载跳转问题
2017/01/13 PHP
PHP实现获取第一个中文首字母并进行排序的方法
2017/05/09 PHP
PHP构造二叉树算法示例
2017/06/21 PHP
Code:loadScript( )加载js的功能函数
2007/02/02 Javascript
JavaScript 面向对象编程(2) 定义类
2010/05/18 Javascript
封装的原生javascript弹出层代码
2010/09/24 Javascript
Jquery插件之打造自定义的select标签
2011/11/30 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
2013/01/23 Javascript
jQuery中odd选择器的定义和用法
2014/12/23 Javascript
纯JS实现本地图片预览的方法
2015/07/31 Javascript
sea.js常用的api简易文档
2016/11/15 Javascript
js实现五星评价功能
2017/03/08 Javascript
AngularJS ui-router (嵌套路由)实例
2017/03/10 Javascript
详解vue 配合vue-resource调用接口获取数据
2017/06/22 Javascript
JS中常用的消息框总结
2018/02/24 Javascript
解决vue项目nginx部署到非根目录下刷新空白的问题
2018/09/27 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
2019/08/27 Javascript
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
2020/12/04 Vue.js
[51:17]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第二场 10月30日
2020/10/31 DOTA
简单文件操作python 修改文件指定行的方法
2013/05/15 Python
python爬虫爬取淘宝商品信息(selenum+phontomjs)
2018/02/24 Python
Python利用heapq实现一个优先级队列的方法
2019/02/03 Python
windows上安装python3教程以及环境变量配置详解
2019/07/18 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
StubHub墨西哥:购买和出售您的门票
2016/09/17 全球购物
美国一家主打母婴用品的团购网站:zulily
2017/09/19 全球购物
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
擅自离岗检讨书
2014/02/11 职场文书
民事起诉书范本
2015/05/19 职场文书
院系推荐意见
2015/06/05 职场文书
2016年小学推普宣传周活动总结
2016/04/06 职场文书