Vue组件中的“组件渲染函数中可能存在无限更新循环”警告

ale*_*lex 2 javascript vue.js vuejs2

我正在创建具有排序功能的基本表:

<template>
  <!-- more code -->
  <tr v-for="item in sortBy(data.body, { name: 'name', order: 1 })">
    <td v-for="field in item">{{ field }}</td>
  </tr>
  <!-- data.body => [{ name: Group 1 }, { name: Group2 }, // etc.] -->
</template>

props: {
  data: {
    type: Object,
    default () {
      return {}
    }
  }
},

methods: {
  sortBy (data, params) { 
    // the warning disappears if I only leave "return data"
    data.sort((a, b) => {
      return a[params.name] - b[params.name] * params.order
    })
    return data
  }
}
Run Code Online (Sandbox Code Playgroud)

由于某种原因,我收到此警告:

[Vue警告]:组件渲染函数中可能有无限的更新循环。

这是为什么以及如何解决?

小智 6

之所以收到警告,是因为您正在更改sortBy中的data.body值。此数据更改将导致渲染功能再次运行。您没有得到无限循环的原因是,在第二次调用sortBy时,数据已被排序,这不会导致data.body发生数据更改。

解决方案就是Jaromanda X提到的。使用slice将复制数组,这意味着data.body的值不会更改,因此不会调用任何重新渲染。

return data.slice().sort(....
Run Code Online (Sandbox Code Playgroud)