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 相关文章推荐
js获取url中指定参数值的示例代码
Dec 14 Javascript
setTimeout()与setInterval()方法区别介绍
Dec 24 Javascript
node.js中的http.createServer方法使用说明
Dec 14 Javascript
DOM基础教程之事件类型
Jan 20 Javascript
jquery实现顶部向右伸缩的导航区域代码
Sep 02 Javascript
酷! 不同风格页面布局幻灯片特效js实现
Feb 19 Javascript
ajax接收后台数据在html页面显示
Feb 19 Javascript
详解webpack打包vue时提取css
May 26 Javascript
JavaScript之创意时钟项目(实例讲解)
Oct 23 Javascript
vue中SPA单页面应用程序详解
Nov 07 Javascript
Webpack优化配置缩小文件搜索范围
Dec 25 Javascript
11个Javascript小技巧帮你提升代码质量(小结)
Dec 28 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
php 常用算法和时间复杂度
2013/07/01 PHP
PHP基础知识介绍
2013/09/17 PHP
php获取网页标题和内容函数(不包含html标签)
2014/02/03 PHP
PHP字符串中特殊符号的过滤方法介绍
2014/02/18 PHP
PHP中call_user_func_array回调函数的用法示例
2016/11/26 PHP
WordPress伪静态规则设置代码实例
2020/12/10 PHP
javascript document.referrer 用法
2009/04/30 Javascript
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
基于jquery自己写tab滑动门(通用版)
2012/10/30 Javascript
JS性能优化笔记搜索整理
2013/08/21 Javascript
解决ueditor jquery javascript 取值问题
2014/12/30 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
js 创建对象 经典模式全面了解
2016/08/16 Javascript
微信小程序 template模板详解及实例代码
2017/03/09 Javascript
javascript+html5+css3自定义弹出窗口效果
2017/10/26 Javascript
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
2017/11/07 Javascript
Bootstrap Table实现定时刷新数据的方法
2018/08/13 Javascript
angular 数据绑定之[]和{{}}的区别
2018/09/25 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
2019/04/14 Javascript
vuex(vue状态管理)的特殊应用案例分享
2020/03/03 Javascript
详解vuejs中执行npm run dev出现页面cannot GET/问题
2020/04/26 Javascript
[04:19]完美世界携手游戏风云打造 卡尔工作室模型介绍篇
2013/04/24 DOTA
[05:01]3.19DOTA2发布会 我们都是刀塔人
2014/03/25 DOTA
详解Python中的多线程编程
2015/04/09 Python
python实现文本文件合并
2015/12/29 Python
深入理解python对json的操作总结
2017/01/05 Python
Pytorch Tensor的索引与切片例子
2019/08/18 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
2020/02/27 Python
jupyter 实现notebook中显示完整的行和列
2020/04/09 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
canvas实现圆绘制的示例代码
2019/09/11 HTML / CSS
HTML5 canvas基本绘图之绘制曲线
2016/06/27 HTML / CSS
同程旅游英文网站:LY.com
2018/11/13 全球购物
《三峡》教学反思
2014/03/01 职场文书
导游词之桂林山水
2019/09/20 职场文书