vue.js 勉強中です
vueのv-forを使って良いねの数が多い順に表示し、同じ投稿はまとめて表示させたい(ランキング機能)
さらにいいねの数もそれぞれ表示させたいと考えています。
store
1state 2rankings: [] 3 4mutation 5ranking(state, tests) { 6 state.rankings = tests 7}, 8 9action 10rank({commit}) { 11 db.collection('goods').orderBy('post_id').get().then(res => { 12 var tests = [] 13 res.forEach(doc => { 14 const rank = doc.data() 15 rank.id = doc.id 16 db.collection('items').doc(rank.post_id).get().then(res => { 17 var test = res.data() 18 test.id = res.id 19 tests.push(test) 20 }) 21 }) 22 commit('ranking', tests) 23 }) 24}
<template> <div v-for="(post, index) in rankposts" :key="index"> <h4>{{post.title}}</h4> <p>{{post.recommend}}</p> </div> </template> <script> export default { computed: { rankposts() { **下に2つ自分で考えたコードが書いてあります } }, created() { this.$store.dispatch('rank') }, } </script>
rankposts()の中身を以下の2つを参考にしましたが、投稿の値が取得できませんでした。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
https://teratail.com/questions/245425
rankposts() { const list = this.$store.state.rankings function groupBy(objectArray, property) { return objectArray.reduce(function (acc, obj) { let key = obj[property] if (!acc[key]) { acc[key] = [] } acc[key].push(obj) return acc }, {}) } let resultData = groupBy(list, 'id') console.log(resultData) return resultData } resultDataの中身 {MxKzTenT5M7yPortf9tL: Array(2), Sx9E1WLZR3QMGPLosilW: Array(1), s6KOsBCbRjOIzzzVrYg4: Array(1)}
rankposts() { const list = this.$store.state.rankings const didlist = list.map(function(data){ return data.id }) .reduce(function(acc, val){ acc[val] != null ? acc[val]++ : acc[val] = 1; return acc; }, {}); return didlist } didlistの中身 {MxKzTenT5M7yPortf9tL: 2, Sx9E1WLZR3QMGPLosilW: 1, s6KOsBCbRjOIzzzVrYg4: 1}
どちらもまとめて返してくれるようにはなっているのですが、この返り値から投稿を取得し、表示させたいのですが自分ではたどり着けませんでした。
もしくはstoreのaction内でこんな書き方の方が良いというのがありましたら教えていただきたいです。
どなたか知恵を貸していただきたいです。
よろしくおねがします。
vue 2.6.1
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/21 21:31 編集