我不确定为什么我的计算机属性错误会产生意外的副作用,如下代码所示。
错误:
✘ 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
,这看起来是正确的答案 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)
仅使用 spread
语法:
computed: {
orderMyReposByStars: function () {
return [...this.myRepos].sort((a, b) => a.stargazers_count < b.stargazers_count)
},
}