Vue——「...infinite update loop...」

一個尤大大曾回覆過的問題

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

最近再寫一個數組渲染時,源數據是拿到的數組通過排序後的數組,正常運行卻出現爆紅:vue

報紅代碼:數組

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

而後...
圖片描述函數

而後百思不得解,最終找到源頭:oop

圖片描述

你的確致使了一個無限循環, 由於 array.sort()改變了數組自身,致使了過濾器又一次被觸發。確保在副本上對數組排序:
return value.slice().sort(...)

解決方案:spa

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)數組的一部分到一個新的數組,並返回這個新數組prototype

  • begin 起始位置 若是未定義,就默認0;若是大於數組長度,返回空數組;若是是負數,則從末尾算起;
  • end 結束位置(不包含該位置元素)若是省略了,就默認到末尾;若是大於數組長度,就取數組長度;若是是負數,則從末尾算起。

技巧:處理類數組對象

slice() 能夠用於把一個類數組對象轉化爲一個新數組code

例如:component

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]

或者blog

[].slice.call({ 0: 0, 1 : 2, 2: 4, length: 4 })
//[0, 2, 4, empty]
相關文章
相關標籤/搜索