【发布时间】:2019-07-29 14:45:36
【问题描述】:
我正在努力思考如何最好地将以下要求实现到 Vuex (vue.js) 应用程序中。
我会尽量保持简单,我希望实现的目标类似于 Hacker News 网站。因此,应用程序需要根据计算/算法计算每个项目(帖子)的分数。分数由喜欢和创建日期的组合决定。因此分数会不断更新(直到指定的时间段到期),因此分数不会存储在数据源中,而是由应用程序计算。
所以我的主要问题是,如何最好地为 Vuex 应用程序实现这一点?
我已经建立了一个 Vuex 帖子存储(我将每篇文章称为“帖子”),并且我能够在列表中显示所有帖子。所以现在我有两个主要目标:
- 为帖子(文章)打分
- 按分数过滤帖子结果列表。
我做了一些研究,一致认为最好将“分数”与“帖子”存储区分开(不添加到“帖子”数组中)。
以下代码运行良好,但感觉很冗长。将这些函数中的任何一个移动到“getters/mutations/actions”会更好吗?
请注意:对于这个例子,我已将计算/算法简化为“喜欢”总数加上“cmets”总数,显然最终算法更复杂,无法像黑客新闻一样工作。
<div>
<button @click="postFilterKey = 'all'"><button>
<button @click="postFilterKey = 'orderByScore'"><button>
</div>
<div v-for="post in filterPosts" v-bind:key="post.value">
<p>Title: {{ post.title }}</p>
<p>Total Likes: {{ post.likes }}</p>
<p>Total Comments: {{ post.comments }}</p>
<p>Score: {{ post.comments | getScore(post.likes) }}</p>
</div>
computed: {
...mapState(["posts"]),
filterPosts () {
return this[this.postFilterKey]
},
all () {
return this.posts;
},
orderByScore (){
return this.posts.sort((b,a) =>
this.calculateScore(a.totalComments, a.totalLike) -
this.calculateScore(b.totalComments, b.totalLike));
},
methods: {
calculateScore(totalComments, totalLikes) {
let score = totalComments + totalLikes
return score;
},
}
filters: {
getScore(totalComments, totalLikes) {
let score = totalComments + totalLikes
return score;
},
}
感谢观看。
【问题讨论】:
-
也许将
orderByScore移动到 Vuex Getter 中可以吗?然后订购的帖子直接链接到商店。如果你有工作代码,你的重构很大程度上取决于个人喜好。我个人会走“住在商店里有什么意义?”的OO路线。并将与商店联系最紧密的东西放在那里。任何过于依赖外部变量的东西都可能不适合住在商店里。再说一次,这只是我的偏好,您可能希望以不同的方式实现它。 -
老实说,看看你的计算/方法/过滤器,作为 Getter 住在 Vuex 商店中,所有这些都是有意义的。
-
此外,如果您需要多个组件中的逻辑,则将内容移入商店意味着您无需复制代码。