计算属性中出现意外的副作用

时间:2018-04-17 02:45:46

标签: vue.js vuejs2

我不确定为什么我的计算机属性错误会产生意外的副作用,如下代码所示。

错误:

 ✘  https://google.com/#q=vue%2Fno-side-effects-in-computed-properties  Unexpected side effect in "orderMyReposByStars" computed property            
  src/components/HelloWorld.vue:84:14
        return this.myRepos.sort((a, b) => a.stargazers_count < b.stargazers_count)

HTML:

<div v-if="myRepos && myRepos.length > 0">
  <h3>My Repos</h3>
  <ul>
    <li v-for="repo in orderMyReposByStars" v-bind:key="repo.id">
      <div class="repo">
        {{repo.name}}
        <div class="pull-right">
          <i class="fas fa-star"></i>
          <span class="bold">{{repo.stargazers_count}}</span>
        </div>
      </div>
    </li>
  </ul>
</div>

JS:

export default {
  name: 'HelloWorld',
  data () {
    return {
      myRepos: null,  <-- THIS IS ULTIMATELY AN ARRAY OF OBJECTS
    }
  },
  computed: {
    orderMyReposByStars: function () {
      return this.myRepos.sort((a, b) => a.stargazers_count < b.stargazers_count)
    },
...

据我所知,根据这里的文档https://vuejs.org/v2/guide/list.html#Displaying-Filtered-Sorted-Results

,这看起来是正确的

3 个答案:

答案 0 :(得分:20)

.sort改变原始数组。

要避免它,请在对数组进行排序之前克隆它。

.slice()是克隆数组的最简单方法之一。见https://stackoverflow.com/a/20547803/5599288

return this.myRepos.slice().sort((a, b) => a.stargazers_count < b.stargazers_count)

在旁注上,null.sort()null.slice()会抛出错误。也许最好将myRepos的初始值设置为空数组[]而不是null

答案 1 :(得分:0)

我的解决方案是在排序前加一个过滤器。

Array.filter(() => true).sort((a, b) => a.menu_order - b.menu_order);

答案 2 :(得分:0)

2021 年简单易读的解决方案...

仅使用 spread 语法:

computed: {
  orderMyReposByStars: function () {
     return [...this.myRepos].sort((a, b) => a.stargazers_count < b.stargazers_count)
  },
}