Vue infinite update loop的问题解决


Posted in Javascript onApril 23, 2019

一个尤大大曾回复过的问题

vue warn : You may have an infinite update loop in a component render function

最近再写一个数组渲染时,源数据是拿到的数组经过排序后的数组,正常运行却出现爆红:

报红代码:

computed: {
 ...mapState({
  fromNames (state) {
  let fromNames = state.quote.fromNames;
  return fromNames.sort((a, b) => b.isBind - a.isBind);;
  },
 }),
 },

然后...

Vue infinite update loop的问题解决

然后百思不得解,最终找到源头:

Vue infinite update loop的问题解决

你的确导致了一个无限循环, 因为array.sort()改变了数组自身,导致了过滤器又一次被触发。确保在副本上对数组排序:
return value.slice().sort(...)

解决方案:

computed: {
 ...mapState({
  fromNames (state) {
  let fromNames = state.quote.fromNames;
  return fromNames.slice().sort((a, b) => b.isBind - a.isBind);
  },
 }),
 },

数组方法 array.slice()用法

arr.slice([begin[, end]])

slice() 方法会浅复制(shallow copy)数组的一部分到一个新的数组,并返回这个新数组。

begin 起始位置 如果未定义,就默认0;如果大于数组长度,返回空数组;如果是负数,则从末尾算起;

end 结束位置(不包含该位置元素)如果省略了,就默认到末尾;如果大于数组长度,就取数组长度;如果是负数,则从末尾算起。

技巧:处理类数组对象

slice() 可以用于把一个类数组对象转化为一个新数组

例如:

function list() {
 return Array.prototype.slice.call(arguments);
}

var list1 = list(1, 2, 3); // [1, 2, 3]

也可以使用.call绑定在函数的Function.prototype(也可以被简化为[].slice.call(arguments)

var unboundSlice = Array.prototype.slice;
var slice = Function.prototype.call.bind(unboundSlice);

function list() {
 return slice(arguments);
}

var list1 = list(1, 2, 3); // [1, 2, 3]

或者

[].slice.call({ 0: 0, 1 : 2, 2: 4, length: 4 })
//[0, 2, 4, empty]

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

Javascript 相关文章推荐
UserData用法总结 lanyu出品
Jul 01 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
Jan 17 Javascript
jQuery实现鼠标点击弹出渐变层的方法
Jul 09 Javascript
在javascript中随机数 math random如何生成指定范围数值的随机数
Oct 21 Javascript
javascript实现粘贴qq截图功能(clipboardData)
May 29 Javascript
BootStrop前端框架入门教程详解
Dec 25 Javascript
Bootstrap 轮播(Carousel)插件
Dec 26 Javascript
JavaScript实现分页效果
Mar 28 Javascript
JavaScript数据结构之数组的表示方法示例
Apr 12 Javascript
vue-cli+webpack在生成的项目中使用bootstrap实例代码
May 26 Javascript
JS路由跳转的简单实现代码
Sep 21 Javascript
Vue中跨域及打包部署到nginx跨域设置方法
Aug 26 Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
Apr 23 #Javascript
仿ElementUI实现一个Form表单的实现代码
Apr 23 #Javascript
Vue在 Nuxt.js 中重定向 404 页面的方法
Apr 23 #Javascript
vue项目首屏加载时间优化实战
Apr 23 #Javascript
灵活使用console让js调试更简单的方法步骤
Apr 23 #Javascript
详解实现一个通用的“划词高亮”在线笔记功能
Apr 23 #Javascript
Vue源码学习之关于对Array的数据侦听实现
Apr 23 #Javascript
You might like
基于HTTP长连接的"服务器推"技术的php 简易聊天室
2009/10/31 PHP
php后门URL的防范
2013/11/12 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
Gambit vs CL BO3 第一场 2.13
2021/03/10 DOTA
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
选择TreeView控件的树状数据节点的JS方法(jquery)
2010/02/06 Javascript
深入理解JavaScript定时机制
2010/10/29 Javascript
25个优雅的jQuery Tooltip插件推荐
2011/05/25 Javascript
js改变Iframe中Src的方法
2015/05/05 Javascript
js实现文字滚动效果
2016/03/03 Javascript
Bootstrap表单组件教程详解
2016/04/26 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
2016/05/18 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
2017/01/18 Javascript
JavaScript初学者必看“new”
2017/06/12 Javascript
BootStrap Select清除选中的状态恢复默认状态
2017/06/20 Javascript
基于 Vue.js 之 iView UI 框架非工程化实践记录(推荐)
2017/11/21 Javascript
jQuery表单元素过滤选择器用法实例分析
2019/02/20 jQuery
vue接口请求加密实例
2020/08/11 Javascript
antd日期选择器禁止选择当天之前的时间操作
2020/10/29 Javascript
[22:20]初生之犊-TI4第5名LGD战队纪录片
2014/08/13 DOTA
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
用pandas按列合并两个文件的实例
2018/04/12 Python
python获取中文字符串长度的方法
2018/11/14 Python
pandas删除指定行详解
2019/04/04 Python
Python 转换文本编码实现解析
2019/08/27 Python
Django中提示消息messages的设置方式
2019/11/15 Python
DJango的创建和使用详解(默认数据库sqlite3)
2019/11/18 Python
法雷奥SQA(electric)面试问题
2016/01/23 面试题
数控技术应用个人求职信范文
2014/02/03 职场文书
2014年法院工作总结
2014/11/24 职场文书
2015年业务工作总结范文
2015/04/10 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书
python开发的自动化运维工具ansible详解
2021/08/07 Python
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB
Oracle中日期的使用方法实例
2022/07/07 Oracle