Skip to content

Commit dd3d18b

Browse files
committed
docs: update examples to use SFCs (vuejs#2174)
1 parent 79a6877 commit dd3d18b

12 files changed

+596
-325
lines changed
Lines changed: 87 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1,133 +1,121 @@
1-
# Vue Router์™€ ์ปดํฌ์ง€์…˜ API %{#vue-router-and-the-composition-api}%
1+
# Vue Router์™€ ์ปดํฌ์ง€์…˜ API %{#Vue-Router-and-the-Composition-API}%
22

33
<VueSchoolLink
4-
href="https://vueschool.io/lessons/router-and-the-composition-api"
5-
title="Learn how to use Vue Router with the composition API"
4+
href="https://vueschool.io/lessons/router-and-the-composition-api"
5+
title="Vue Router์™€ ์ปดํฌ์ง€์…˜ API ์‚ฌ์šฉ๋ฒ• ๋ฐฐ์šฐ๊ธฐ"
66
/>
77

8-
Vue 3์—์„œ๋Š” `setup`๊ณผ [์ปดํฌ์ง€์…˜ API](https://vuejs.kr/guide/extras/composition-api-faq.html)๊ฐ€ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์˜ ํƒ์ƒ‰ ๊ฐ€๋“œ์™€ `this`์—์„œ ๋ผ์šฐํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ธฐ์กด ๋ฐฉ์‹์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
8+
Vue์˜ [์ปดํฌ์ง€์…˜ API](https://vuejs.org/guide/extras/composition-api-faq.html) ๋„์ž…์€ ์ƒˆ๋กœ์šด ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์—ˆ์ง€๋งŒ, Vue Router์˜ ์ „์ฒด ์ž ์žฌ๋ ฅ์„ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ `this`์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๋Œ€์ฒดํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ ๋‚ด ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฐ€๋“œ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
99

10-
## `setup` ๋‚ด๋ถ€์—์„œ ๋ผ์šฐํ„ฐ ๋ฐ ํ˜„์žฌ ๋ผ์šฐํŠธ์— ์ ‘๊ทผํ•˜๊ธฐ %{#accessing-the-router-and-current-route-inside-setup}%
10+
## `setup` ๋‚ด์—์„œ ๋ผ์šฐํ„ฐ ๋ฐ ํ˜„์žฌ ๋ฃจํŠธ ์ ‘๊ทผ %{#Accessing-the-Router-and-current-Route-inside-setup}%
1111

12-
`setup` ๋‚ด๋ถ€์—์„œ๋Š” `this`์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, `this.$router` ๋˜๋Š” `this.$route`์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” `useRouter` ๋˜๋Š” `useRoute` ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
12+
`setup` ๋‚ด์—์„œ `this`์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— `this.$router`๋‚˜ `this.$route`์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , `useRouter`์™€ `useRoute` ์ปดํฌ์ €๋ธ”์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:
1313

14-
```js
14+
```vue
15+
<script setup>
1516
import { useRouter, useRoute } from 'vue-router'
1617
17-
export default {
18-
setup() {
19-
const router = useRouter()
20-
const route = useRoute()
21-
22-
function pushWithQuery(query) {
23-
router.push({
24-
name: 'search',
25-
query: {
26-
...route.query,
27-
...route,
28-
},
29-
})
30-
}
31-
},
18+
const router = useRouter()
19+
const route = useRoute()
20+
21+
function pushWithQuery(query) {
22+
router.push({
23+
name: 'search',
24+
query: {
25+
...route.query,
26+
...query,
27+
},
28+
})
3229
}
30+
</script>
3331
```
3432

35-
`route`๋Š” ๋ฐ˜์‘ํ˜• ๊ฐ์ฒด์ด๋ฏ€๋กœ ํ•ด๋‹น ์†์„ฑ์€ ๋ชจ๋‘ ๊ฐ์‹œํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, `route` ๊ฐ์ฒด ์ „์ฒด๋ฅผ ๊ฐ์‹œํ•˜๋Š” ๊ฒƒ์€ ํ”ผํ•˜๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ, ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง์ ‘ ๊ฐ์‹œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
33+
`route` ๊ฐ์ฒด๋Š” ๋ฐ˜์‘ํ˜• ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ, `route` ๊ฐ์ฒด ์ „์ฒด๋ฅผ ๊ฐ์‹œํ•˜๋Š” ๊ฒƒ์€ **ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค**. ๋Œ€์‹ , ๋ณ€๊ฒฝ์„ ๊ธฐ๋Œ€ํ•˜๋Š” ์†์„ฑ๋“ค์„ ์ง์ ‘ ๊ฐ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
3634

37-
```js
35+
```vue
36+
<script setup>
3837
import { useRoute } from 'vue-router'
3938
import { ref, watch } from 'vue'
4039
41-
export default {
42-
setup() {
43-
const route = useRoute()
44-
const userData = ref()
45-
46-
// ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์œ ์ € ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ.
47-
watch(
48-
() => route.params.id,
49-
async newId => {
50-
userData.value = await fetchUser(newId)
51-
}
52-
)
53-
},
54-
}
40+
const route = useRoute()
41+
const userData = ref()
42+
43+
// ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€๊ฒฝ ์‹œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค
44+
watch(
45+
() => route.params.id,
46+
async newId => {
47+
userData.value = await fetchUser(newId)
48+
}
49+
)
50+
</script>
5551
```
5652

57-
ํ…œํ”Œ๋ฆฟ ๋‚ด๋ถ€์—์„œ๋Š” ์—ฌ์ „ํžˆ `$router` ๋ฐ `$route`๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, `setup` ๋‚ด๋ถ€์—์„œ `router` ๋ฐ `route`๋ฅผ ๋ฐ˜ํ™˜ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
53+
ํ…œํ”Œ๋ฆฟ์—์„œ๋Š” ์—ฌ์ „ํžˆ `$router`์™€ `$route`์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํ…œํ”Œ๋ฆฟ์—์„œ๋งŒ ์ด ๊ฐ์ฒด๋“ค์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ `useRouter`๋‚˜ `useRoute`๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
5854

59-
## ํƒ์ƒ‰ ๊ฐ€๋“œ %{#navigation-guards}%
55+
## ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฐ€๋“œ %{#Navigation-Guards}%
6056

61-
Vue Router๋Š” ์—…๋ฐ์ดํŠธ ๋ฐ ๋ฆฌ๋ธŒ ๊ฐ€๋“œ๋ฅผ ์ปดํฌ์ง€์…˜ API ๋ฉ”์„œ๋“œ๋กœ ๋…ธ์ถœํ•˜๋ฏ€๋กœ, `setup` ํ•จ์ˆ˜์—์„œ ์ปดํฌ๋„ŒํŠธ ๋‚ด ํƒ์ƒ‰ ๊ฐ€๋“œ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
57+
Vue Router๋Š” ์ปดํฌ์ง€์…˜ API ํ•จ์ˆ˜๋กœ ์—…๋ฐ์ดํŠธ์™€ ๋– ๋‚จ ๊ฐ€๋“œ๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค:
6258

63-
```js
59+
```vue
60+
<script setup>
6461
import { onBeforeRouteLeave, onBeforeRouteUpdate } from 'vue-router'
6562
import { ref } from 'vue'
6663
67-
export default {
68-
setup() {
69-
// `this`์— ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†์œผ๋ฉฐ, beforeRouteLeave ์˜ต์…˜๊ณผ ๋™์ผ
70-
onBeforeRouteLeave((to, from) => {
71-
const answer = window.confirm(
72-
'์ •๋ง ๋– ๋‚˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ €์žฅ๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค!'
73-
)
74-
// ํƒ์ƒ‰์„ ์ทจ์†Œํ•˜๊ณ  ๊ฐ™์€ ํŽ˜์ด์ง€์— ๋จธ๋ฌผ๊ธฐ
75-
if (!answer) return false
76-
})
77-
78-
const userData = ref()
79-
80-
// `this`์— ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†์œผ๋ฉฐ, beforeRouteUpdate ์˜ต์…˜๊ณผ ๋™์ผ
81-
onBeforeRouteUpdate(async (to, from) => {
82-
// ์ฟผ๋ฆฌ ๋˜๋Š” ํ•ด์‹œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ID๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ์—๋งŒ ์œ ์ € ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ.
83-
if (to.params.id !== from.params.id) {
84-
userData.value = await fetchUser(to.params.id)
85-
}
86-
})
87-
},
88-
}
64+
// beforeRouteLeave ์˜ต์…˜๊ณผ ๊ฐ™์ง€๋งŒ `this`์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ์—†์Šต๋‹ˆ๋‹ค
65+
onBeforeRouteLeave((to, from) => {
66+
const answer = window.confirm(
67+
'์ •๋ง ํŽ˜์ด์ง€๋ฅผ ๋– ๋‚˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ €์žฅ๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค!'
68+
)
69+
// ๋„ค๋น„๊ฒŒ์ด์…˜์„ ์ทจ์†Œํ•˜๊ณ  ๊ฐ™์€ ํŽ˜์ด์ง€์— ๋จธ๋ญ…๋‹ˆ๋‹ค
70+
if (!answer) return false
71+
})
72+
73+
const userData = ref()
74+
75+
// beforeRouteUpdate ์˜ต์…˜๊ณผ ๊ฐ™์ง€๋งŒ `this`์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ์—†์Šต๋‹ˆ๋‹ค
76+
onBeforeRouteUpdate(async (to, from) => {
77+
// id๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ์ž๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค
78+
if (to.params.id !== from.params.id) {
79+
userData.value = await fetchUser(to.params.id)
80+
}
81+
})
82+
</script>
8983
```
9084

91-
์ปดํฌ์ง€์…˜ API ๊ฐ€๋“œ๋Š” `<router-view>`๋กœ ๋ Œ๋”๋ง๋œ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ผ์šฐํŠธ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
85+
์ปดํฌ์ง€์…˜ API ๊ฐ€๋“œ๋Š” `<router-view>`์— ์˜ํ•ด ๋ Œ๋”๋ง๋œ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ปดํฌ๋„ŒํŠธ ๋‚ด ๊ฐ€๋“œ์ฒ˜๋Ÿผ ๋ผ์šฐํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
9286

93-
## `useLink`
87+
## `useLink` %{#useLink}%
9488

95-
Vue ๋ผ์šฐํ„ฐ๋Š” RouterLink์˜ ๋‚ด๋ถ€ ๋™์ž‘์„ ์ปดํฌ์ €๋ธ”๋กœ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” `RouterLink`์˜ props์™€ ๊ฐ™์€ ๋ฐ˜์‘ ๊ฐ์ฒด๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  low-level ์†์„ฑ์„ ๋…ธ์ถœํ•˜์—ฌ ์ž์‹ ๋งŒ์˜ `RouterLink` ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž ์ง€์ • ๋งํฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:
89+
Vue Router๋Š” RouterLink์˜ ๋‚ด๋ถ€ ๋™์ž‘์„ ์ปดํฌ์ €๋ธ”๋กœ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” `RouterLink`์˜ props์™€ ๊ฐ™์€ ๋ฐ˜์‘ํ˜• ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„๋“ค์ด๋ฉฐ, ์ž์‹ ๋งŒ์˜ `RouterLink` ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž ์ •์˜ ๋งํฌ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ €์ˆ˜์ค€ ์†์„ฑ๋“ค์„ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค:
9690

97-
```js
91+
```vue
92+
<script setup>
9893
import { RouterLink, useLink } from 'vue-router'
9994
import { computed } from 'vue'
10095
101-
export default {
102-
name: 'AppLink',
103-
104-
props: {
105-
// TypeScript๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, @ts-ignore ์ถ”๊ฐ€๊ฐ€ ํ•„์š”ํ•จ
106-
...RouterLink.props,
107-
inactiveClass: String,
108-
},
109-
110-
setup(props) {
111-
const {
112-
// ํ—ˆ์šฉ๋œ ๋ผ์šฐํŠธ(route) ๊ฐ์ฒด
113-
route,
114-
// ๋งํฌ์—์„œ ์‚ฌ์šฉํ•  href
115-
href,
116-
// ๋งํฌ๊ฐ€ ํ™œ์„ฑ ์ƒํƒœ์ธ์ง€ ๋‚˜ํƒ€๋‚ด๋Š” boolean ํƒ€์ž…์˜ ๊ฐ’ ์ฐธ์กฐ
117-
isActive,
118-
// ๋งํฌ๊ฐ€ ์ •ํ™•ํžˆ ํ™œ์„ฑ ์ƒํƒœ์ธ์ง€ ๋‚˜ํƒ€๋‚ด๋Š” boolean ํƒ€์ž…์˜ ๊ฐ’ ์ฐธ์กฐ
119-
isExactActive,
120-
// ๋งํฌ๋กœ ์ด๋™ํ•˜๋Š” ํ•จ์ˆ˜
121-
navigate
122-
} = useLink(props)
123-
124-
const isExternalLink = computed(
125-
() => typeof props.to === 'string' && props.to.startsWith('http')
126-
)
127-
128-
return { isExternalLink, href, navigate, isActive }
129-
},
130-
}
96+
const props = defineProps({
97+
// TypeScript ์‚ฌ์šฉ ์‹œ @ts-ignore ์ถ”๊ฐ€
98+
...RouterLink.props,
99+
inactiveClass: String,
100+
})
101+
102+
const {
103+
// ํ•ด๊ฒฐ๋œ ๋ผ์šฐํŠธ ๊ฐ์ฒด
104+
route,
105+
// ๋งํฌ์—์„œ ์‚ฌ์šฉํ•  href
106+
href,
107+
// ๋งํฌ๊ฐ€ ํ™œ์„ฑํ™”๋˜์—ˆ๋Š”์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถˆ๋ฆฐ ref
108+
isActive,
109+
// ๋งํฌ๊ฐ€ ์ •ํ™•ํžˆ ํ™œ์„ฑํ™”๋˜์—ˆ๋Š”์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถˆ๋ฆฐ ref
110+
isExactActive,
111+
// ๋งํฌ๋กœ ์ด๋™ํ•˜๋Š” ํ•จ์ˆ˜
112+
navigate
113+
} = useLink(props)
114+
115+
const isExternalLink = computed(
116+
() => typeof props.to === 'string' && props.to.startsWith('http')
117+
)
118+
</script>
131119
```
132120

133-
RouterLink์˜ `v-slot`์€ `useLink` ์ปดํฌ์ €๋ธ”๊ณผ ๋™์ผํ•œ ์†์„ฑ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
121+
RouterLink์˜ `v-slot`์€ `useLink` ์ปดํฌ์ €๋ธ”๊ณผ ๋™์ผํ•œ ์†์„ฑ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

0 commit comments

Comments
ย (0)