Skip to content

Commit ec64dac

Browse files
committed
refactor(default-theme): Extract PageNav component.
1 parent e0d8ed1 commit ec64dac

File tree

2 files changed

+114
-105
lines changed

2 files changed

+114
-105
lines changed

packages/@vuepress/theme-default/components/Page.vue

+5-105
Original file line numberDiff line numberDiff line change
@@ -3,125 +3,25 @@
33
<slot name="top"/>
44

55
<Content/>
6-
76
<PageEdit/>
8-
9-
<div class="page-nav" v-if="prev || next">
10-
<p class="inner">
11-
<span
12-
v-if="prev"
13-
class="prev"
14-
>
15-
16-
<router-link
17-
v-if="prev"
18-
class="prev"
19-
:to="prev.path"
20-
>
21-
{{ prev.title || prev.path }}
22-
</router-link>
23-
</span>
24-
25-
<span
26-
v-if="next"
27-
class="next"
28-
>
29-
<router-link
30-
v-if="next"
31-
:to="next.path"
32-
>
33-
{{ next.title || next.path }}
34-
</router-link>
35-
36-
</span>
37-
</p>
38-
</div>
7+
<PageNav v-bind="{ sidebarItems }"/>
398

409
<slot name="bottom"/>
4110
</main>
4211
</template>
4312

4413
<script>
45-
import { resolvePage } from '../util'
46-
import PageEdit from '@theme/components/PageEdit'
14+
import PageEdit from '@theme/components/PageEdit.vue'
15+
import PageNav from '@theme/components/PageNav.vue'
4716
4817
export default {
49-
components: { PageEdit },
50-
props: ['sidebarItems'],
51-
52-
computed: {
53-
prev () {
54-
const prev = this.$page.frontmatter.prev
55-
if (prev === false) {
56-
return
57-
} else if (prev) {
58-
return resolvePage(this.$site.pages, prev, this.$route.path)
59-
} else {
60-
return resolvePrev(this.$page, this.sidebarItems)
61-
}
62-
},
63-
64-
next () {
65-
const next = this.$page.frontmatter.next
66-
if (next === false) {
67-
return
68-
} else if (next) {
69-
return resolvePage(this.$site.pages, next, this.$route.path)
70-
} else {
71-
return resolveNext(this.$page, this.sidebarItems)
72-
}
73-
}
74-
}
75-
}
76-
77-
function resolvePrev (page, items) {
78-
return find(page, items, -1)
79-
}
80-
81-
function resolveNext (page, items) {
82-
return find(page, items, 1)
83-
}
84-
85-
function find (page, items, offset) {
86-
const res = []
87-
flatten(items, res)
88-
for (let i = 0; i < res.length; i++) {
89-
const cur = res[i]
90-
if (cur.type === 'page' && cur.path === decodeURIComponent(page.path)) {
91-
return res[i + offset]
92-
}
93-
}
94-
}
95-
96-
function flatten (items, res) {
97-
for (let i = 0, l = items.length; i < l; i++) {
98-
if (items[i].type === 'group') {
99-
flatten(items[i].children || [], res)
100-
} else {
101-
res.push(items[i])
102-
}
103-
}
18+
components: { PageEdit, PageNav },
19+
props: ['sidebarItems']
10420
}
105-
10621
</script>
10722

10823
<style lang="stylus">
109-
@require '../styles/wrapper.styl'
110-
11124
.page
11225
padding-bottom 2rem
11326
display block
114-
115-
.page-nav
116-
@extend $wrapper
117-
padding-top 1rem
118-
padding-bottom 0
119-
.inner
120-
min-height 2rem
121-
margin-top 0
122-
border-top 1px solid $borderColor
123-
padding-top 1rem
124-
overflow auto // clear float
125-
.next
126-
float right
12727
</style>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
<template>
2+
<div class="page-nav" v-if="prev || next">
3+
<p class="inner">
4+
<span
5+
v-if="prev"
6+
class="prev"
7+
>
8+
9+
<router-link
10+
v-if="prev"
11+
class="prev"
12+
:to="prev.path"
13+
>
14+
{{ prev.title || prev.path }}
15+
</router-link>
16+
</span>
17+
18+
<span
19+
v-if="next"
20+
class="next"
21+
>
22+
<router-link
23+
v-if="next"
24+
:to="next.path"
25+
>
26+
{{ next.title || next.path }}
27+
</router-link>
28+
29+
</span>
30+
</p>
31+
</div>
32+
</template>
33+
<script>
34+
import { resolvePage } from '../util'
35+
36+
export default {
37+
name: 'PageNav',
38+
props: ['sidebarItems'],
39+
computed: {
40+
prev () {
41+
const prev = this.$page.frontmatter.prev
42+
if (prev === false) {
43+
return
44+
} else if (prev) {
45+
return resolvePage(this.$site.pages, prev, this.$route.path)
46+
} else {
47+
return resolvePrev(this.$page, this.sidebarItems)
48+
}
49+
},
50+
51+
next () {
52+
const next = this.$page.frontmatter.next
53+
if (next === false) {
54+
return
55+
} else if (next) {
56+
return resolvePage(this.$site.pages, next, this.$route.path)
57+
} else {
58+
return resolveNext(this.$page, this.sidebarItems)
59+
}
60+
}
61+
}
62+
}
63+
64+
function resolvePrev (page, items) {
65+
return find(page, items, -1)
66+
}
67+
68+
function resolveNext (page, items) {
69+
return find(page, items, 1)
70+
}
71+
72+
function find (page, items, offset) {
73+
const res = []
74+
flatten(items, res)
75+
for (let i = 0; i < res.length; i++) {
76+
const cur = res[i]
77+
if (cur.type === 'page' && cur.path === decodeURIComponent(page.path)) {
78+
return res[i + offset]
79+
}
80+
}
81+
}
82+
83+
function flatten (items, res) {
84+
for (let i = 0, l = items.length; i < l; i++) {
85+
if (items[i].type === 'group') {
86+
flatten(items[i].children || [], res)
87+
} else {
88+
res.push(items[i])
89+
}
90+
}
91+
}
92+
93+
</script>
94+
<style lang="stylus">
95+
@require '../styles/wrapper.styl'
96+
97+
.page-nav
98+
@extend $wrapper
99+
padding-top 1rem
100+
padding-bottom 0
101+
.inner
102+
min-height 2rem
103+
margin-top 0
104+
border-top 1px solid $borderColor
105+
padding-top 1rem
106+
overflow auto // clear float
107+
.next
108+
float right
109+
</style>

0 commit comments

Comments
 (0)