Commit 90411aad authored by Evan You's avatar Evan You

improve comments loading perf

parent 6e8987ce
...@@ -30,11 +30,6 @@ export default { ...@@ -30,11 +30,6 @@ export default {
return this.$store.state.items[this.id] return this.$store.state.items[this.id]
} }
}, },
beforeMount () {
this.$store.dispatch('FETCH_ITEMS', {
ids: [this.id]
})
},
methods: { methods: {
pluralize (n) { pluralize (n) {
return n + (n === 1 ? ' reply' : ' replies') return n + (n === 1 ? ' reply' : ' replies')
......
<template> <template>
<div class="item-view" v-if="item"> <div class="item-view" v-if="item">
<spinner :show="!item"></spinner>
<template v-if="item"> <template v-if="item">
<div class="item-view-header"> <div class="item-view-header">
<a :href="item.url" target="_blank"> <a :href="item.url" target="_blank">
...@@ -18,8 +17,9 @@ ...@@ -18,8 +17,9 @@
<div class="item-view-comments"> <div class="item-view-comments">
<p class="item-view-comments-header"> <p class="item-view-comments-header">
{{ item.kids ? item.descendants + ' comments' : 'No comments yet.'}} {{ item.kids ? item.descendants + ' comments' : 'No comments yet.'}}
<spinner :show="loading"></spinner>
</p> </p>
<ul v-if="item.kids" class="comment-children"> <ul v-if="!loading" class="comment-children">
<comment v-for="id in item.kids" :id="id"></comment> <comment v-for="id in item.kids" :id="id"></comment>
</ul> </ul>
</div> </div>
...@@ -37,17 +37,44 @@ function fetchItem (store) { ...@@ -37,17 +37,44 @@ function fetchItem (store) {
}) })
} }
// recursively fetch all descendent comments
function fetchComments (store, item) {
if (item.kids) {
return store.dispatch('FETCH_ITEMS', {
ids: item.kids
}).then(() => Promise.all(item.kids.map(id => {
return fetchComments(store, store.state.items[id])
})))
}
}
function fetchItemAndComments (store) {
return fetchItem(store).then(() => {
const { items, route } = store.state
return fetchComments(store, items[route.params.id])
})
}
export default { export default {
name: 'item-view', name: 'item-view',
components: { Spinner, Comment }, components: { Spinner, Comment },
data () {
return {
loading: true
}
},
computed: { computed: {
item () { item () {
return this.$store.state.items[this.$route.params.id] return this.$store.state.items[this.$route.params.id]
} }
}, },
// on the server, only fetch the item itself
preFetch: fetchItem, preFetch: fetchItem,
// on the client, fetch everything
beforeMount () { beforeMount () {
fetchItem(this.$store) fetchItemAndComments(this.$store).then(() => {
this.loading = false
})
} }
} }
</script> </script>
...@@ -76,6 +103,12 @@ export default { ...@@ -76,6 +103,12 @@ export default {
margin 0 margin 0
font-size 1.1em font-size 1.1em
padding 1em 0 padding 1em 0
position relative
.spinner
position absolute
top 0
right 0
bottom auto
.comment-children .comment-children
list-style-type none list-style-type none
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment