Commit 67b5bf0d authored by Evan You's avatar Evan You

pages

parent 5b70c6d2
<template> <template>
<div id="app"> <div id="app">
<ul> <ul>
<li><router-link to="/">News</router-link></li> <li><router-link to="/news/1">page 1</router-link></li>
<li><router-link to="/news/2">page 2</router-link></li>
<li><router-link to="/about">About</router-link></li> <li><router-link to="/about">About</router-link></li>
</ul> </ul>
<transition name="view" mode="out-in"> <transition name="view" mode="out-in">
......
...@@ -23,7 +23,7 @@ const store = new Vuex.Store({ ...@@ -23,7 +23,7 @@ const store = new Vuex.Store({
}) })
}, },
FETCH_NEWS: ({ commit, state }) => { FETCH_NEWS: ({ commit, state }) => {
const ids = getDisplayedIds(state).filter(id => !state.items.id) const ids = getDisplayedIds(state).filter(id => !state.items[id])
return fetchItems(ids).then(items => { return fetchItems(ids).then(items => {
commit('RECEIVE_ITEMS', { items }) commit('RECEIVE_ITEMS', { items })
}) })
...@@ -56,7 +56,7 @@ if (inBrowser) { ...@@ -56,7 +56,7 @@ if (inBrowser) {
} }
function getDisplayedIds (state) { function getDisplayedIds (state) {
const page = state.route.params.page || 1 const page = Number(state.route.params.page) || 1
const { storiesPerPage, topStoryIds } = state const { storiesPerPage, topStoryIds } = state
const start = (page - 1) * storiesPerPage const start = (page - 1) * storiesPerPage
const end = page * storiesPerPage const end = page * storiesPerPage
......
<template> <template>
<div> <div>
<h2>News</h2> <h2>News</h2>
<ul> <transition :name="transition">
<ul class="news-list" :key="$route.params.page">
<li v-for="item in news" :key="item.id"> <li v-for="item in news" :key="item.id">
{{ item.title }} {{ item.title }}
</li> </li>
</ul> </ul>
</transition>
</div> </div>
</template> </template>
...@@ -18,10 +20,23 @@ const fetchData = store => { ...@@ -18,10 +20,23 @@ const fetchData = store => {
export default { export default {
name: 'news', name: 'news',
data () {
return {
transition: 'slide-left'
}
},
prefetch: fetchData, prefetch: fetchData,
mounted () { mounted () {
fetchData(this.$store) fetchData(this.$store)
}, },
watch: {
'$route' (to, from) {
this.$store.dispatch(`FETCH_NEWS`)
this.transition = to.params.page > from.params.page
? 'slide-left'
: 'slide-right'
}
},
computed: { computed: {
news () { news () {
return this.$store.getters.news return this.$store.getters.news
...@@ -29,3 +44,20 @@ export default { ...@@ -29,3 +44,20 @@ export default {
} }
} }
</script> </script>
<style>
.news-list {
position: absolute;
transition: all .5s cubic-bezier(.55,0,.1,1);
}
.slide-left-enter, .slide-right-leave-active {
opacity: 0;
-webkit-transform: translate(30px, 0);
transform: translate(30px, 0);
}
.slide-left-leave-active, .slide-right-enter {
opacity: 0;
-webkit-transform: translate(-30px, 0);
transform: translate(-30px, 0);
}
</style>
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