# ๋ค๋น๊ฒ์ด์ ๊ฐ๋
๋ค๋น๊ฒ์ด์
๊ฐ๋(Navigation Guard
(opens new window))๋ ํน์ URL์ ์ ๊ทผ(Navigation) ํ๊ธฐ ์ ์ ๋ถ๋ ค์ง๋ ํ
(Hook)์ ์ผ์ข
์ผ๋ก, ๋ค๋ฅธ ํ์ด์ง๋ก ์ฐํ ํ๊ฑฐ๋ ์ ๊ทผ ์์ฒด๋ฅผ ์ทจ์์ํฌ ์ ์๊ธฐ ๋๋ฌธ์ ๋ค๋น๊ฒ์ด์
๊ฐ๋๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค.
์ฌ์ฉ์์ ๊ถํ์ ๋ฐ๋ผ ํ์ด์ง ์ ๊ทผ์ ๋ง๊ฑฐ๋ ํ์ด์ง๋ฅผ ๋ก๋ฉํ๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ถ๋ฌ์ฌ ๋ ์ฌ์ฉํ๊ธฐ ์ข์ ๊ธฐ์ ์ ๋๋ค. ์ฌ์ค์ ์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌํํ ๋๋ ๊ฑฐ์ ํ์๋ก ๊ตฌํํด์ผ ํฉ๋๋ค.
# ๋ค๋น๊ฒ์ด์ ๊ฐ๋ ์ข ๋ฅ
๋ค๋น๊ฒ์ด์ ๊ฐ๋์ ์ข ๋ฅ๋ ์ ์ฉ๋๋ ์์น, ๋ฒ์์ ๋ฐ๋ผ์ ์ ์ญ, ์ง์ญ, ์ปดํฌ๋ํธ 3๊ฐ์ง๋ก ๋๋ฉ๋๋ค.
# ์ ์ญ ๊ฐ๋
์ ์ญ ๊ฐ๋๋ ๋ชจ๋ ๋ผ์ฐํ
์ ์ ์ฉ๋๋ ๋ค๋น๊ฒ์ด์
๊ฐ๋์
๋๋ค. ๋ผ์ฐํฐ์ beforeEach
๋ผ๋ ๋ฉ์๋๋ฅผ ํตํด ์ ์ญ๊ฐ๋์ ๋ก์ง์ ์ค์ ํ ์ ์์ต๋๋ค. ์๋๋ ์ ์ญ ๊ฐ๋๋ฅผ ์ค์ ํ๋ ์์ ์ฝ๋์
๋๋ค.
var router = new VueRouter();
router.beforeEach(function(to, from, next) {
// ...
});
๋ทฐ ๋ผ์ฐํฐ ์ธ์คํด์ค๋ฅผ ํ๋ ์์ฑํ๊ณ ํด๋น ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋ ๋ณ์์ beforeEach()
API๋ฅผ ํธ์ถํฉ๋๋ค. ์ธ์๋ก ๋ฐ์ 3๊ฐ์ ๋ณ์๋ ๋ค์๊ณผ ๊ฐ์ ์ญํ ์ ํฉ๋๋ค.
- to : ์ด๋ํ url
- from : ํ์ฌ url
- next : to์์ ์ง์ ํ url๋ก ์ด๋ํ๊ธฐ ์ํด ๊ผญ ํธ์ถํด์ผ ํ๋ ํจ์
TIP
next
ํจ์์ ์ธ์์ ๋ฐ๋ผ์ ๋ผ์ฐํ
ํ์ฉ ์ฌ๋ถ๊ฐ ๋ฌ๋ผ์ง๋๋ค.
next()
: ๋ผ์ฐํ
์น์ธ
next(false)
: ๋ผ์ฐํ
์ทจ์
next('/')
: ํน์ ๋ผ์ฐํธ๋ก ์ง์
(route.push
์ฒ๋ผ ์ง์
ํ๊ณ ์ ํ๋ ๊ฒฝ๋ก ์ง์ ๊ฐ๋ฅ. ์ฐธ์กฐ (opens new window))
WARNING
๋ผ์ฐํ
ํ์ฉ ์ฌ๋ถ์ ์๊ด์์ด ๋ฐ๋์ next
๋ฅผ ํธ์ถํด์ผํฉ๋๋ค. ํธ์ถ๋์ง ์์ ๊ฒฝ์ฐ ๋ผ์ฐํ
์ด ์งํ๋์ง ์๊ณ ๋๊ธฐ ์ํ์ ๋น ์ง๋๋ค.
# ์ง์ญ ๊ฐ๋
์ง์ญ ๊ฐ๋๋ ๋ผ์ฐํ
๋ณ๋ก ์ ์ฉ๋๋ ๋ค๋น๊ฒ์ด์
๊ฐ๋์
๋๋ค. ์๋์ ๊ฐ์ด ํน์ ๋ผ์ฐํธ์ beforeEnter
์์ฑ์ ํธ์ถํ ํจ์๋ฅผ ์ง์ ํฉ๋๋ค.
var router = new VueRouter({
routes: [
{
path: "/login",
component: Login,
beforeEnter: function(to, from, next) {
// ์ธ์ฆ ๊ฐ ๊ฒ์ฆ ๋ก์ง ์ถ๊ฐ
},
},
],
});
beforeEnter()
์ ์ธ์ 3๊ฐ๋ ์์์ ์ดํด๋ณธ ๋ด์ฉ๊ณผ ๋์ผํฉ๋๋ค.
# ์ปดํฌ๋ํธ ๊ฐ๋
์ปดํฌ๋ํธ ๊ฐ๋๋ ์ปดํฌ๋ํธ ์ธ์คํด์ค๋ฅผ ํตํด ๋ผ์ฐํ ์ ์ ์ดํ๋ ๋ค๋น๊ฒ์ด์ ๊ฐ๋์ ๋๋ค. ๋ชฉ์ ์ ๋ฐ๋ผ ๋ค์ ์ธ ์ข ๋ฅ๋ก ๋๋์ง๋ง ์ธ์๋ค์ ์์์ ์ดํด๋ณธ ์ ์ญ, ์ง์ญ ๊ฐ๋์ ๋์ผํฉ๋๋ค.
# beforeRouteEnter
beforeRouteEnter
๋ ์ปดํฌ๋ํธ ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ธฐ ์ ์ ํธ์ถ๋ฉ๋๋ค. ์ธ์คํด์ค ์์ฑ ์ ์ด๊ธฐ ๋๋ฌธ์ this
๋ฅผ ํตํ ์ธ์คํด์ค ์ ๊ทผ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๋์ ์ธ์คํด์ค๋ฅผ ์กฐ์ํ๋ ์ฝ๋ฐฑ์ next
์ ์ ๋ฌํ๋ฉด ์ธ์คํด์ค๊ฐ ์์ฑ๋ ์ดํ์ ์ฝ๋ฐฑ์ด ํธ์ถ๋ฉ๋๋ค.
<script>
export default {
data() {
return {
state: "pending",
};
},
beforeRouteEnter(to, from, next) {
// ๋ค๋น๊ฒ์ด์
์น์ธ ํ state๋ฅผ ์
๋ฐ์ดํธ
next((vm) => (vm.state = "approved"));
},
};
</script>
# beforeRouteUpdate
beforeRouteUpdate
๋ ๋์ผํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ง๋ง ํ์ด์ง ์ฃผ์๊ฐ ๋ฐ๋ ๊ฒฝ์ฐ ํธ์ถ๋ฉ๋๋ค. ๋์ ๋ผ์ฐํ
์ ํตํด์ ํ์ด์ง์ ์ฃผ์๋ง ๋ฐ๋๊ณ ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์ฌํ์ฉํ๋ ๊ฒฝ์ฐ๋ฅผ ์๋ก ๋ค ์ ์์ต๋๋ค.
new VueRouter({
routes: [{ path: "/foo/:id", component: Foo }],
});
// ํ์ฌ URL: /foo/1
<script>
export default {
beforeRouteUpdate(to, from, next) {
console.log(this.$route.params.id); // 1
next();
},
methods: {
moveToNext() {
// ํ์ด์ง๋ฅผ ์ด๋ ํ๊ธฐ์ ์ beforeRouteUpdate๋ฅผ ํธ์ถํฉ๋๋ค.
this.$router.push('/foo/2');
},
},
};
</script>
# beforeRouteLeave
beforeRouteLeave
๋ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ฒ์ด๋ ์๋ก์ด ํ์ด์ง๋ก ์ด๋ํ ๋ ํธ์ถ๋ฉ๋๋ค. ๋ณดํต ์ฌ์ฉ์๊ฐ ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฅํ์ง ์๊ณ ๊ฐ์์ค๋ฝ๊ฒ ์ฌ์ดํธ๋ฅผ ๋ฒ์ด๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋ฉ๋๋ค. next(false)
๋ก ํ์ด์ง ์ด๋์ ๋ง์ ์ ์์ต๋๋ค.
beforeRouteLeave (to, from, next) {
const answer = window.confirm('์ฌ์ดํธ์์ ๋๊ฐ์๊ฒ ์ต๋๊น? ๋ณ๊ฒฝ์ฌํญ์ด ์ ์ฅ๋์ง ์์ ์ ์์ต๋๋ค.')
if (answer) {
next()
} else {
next(false)
}
}
# ๋ค๋น๊ฒ์ด์ ๊ฐ๋ ํธ์ถ ์์(flow)
- ๋นํ์ฑํ๋๋ ์ปดํฌ๋ํธ์์
beforeRouteLeave
ํธ์ถ - ์ ์ญ ๊ฐ๋
beforeEach
ํธ์ถ - ์ฌ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธ๋ผ๋ฉด
beforeRouteUpdate
ํธ์ถ - ์ง์ญ ๊ฐ๋
beforeEnter
ํธ์ถ - ํ์ฑํ๋๋ ์ปดํฌ๋ํธ์์
beforeRouteEnter
ํธ์ถ beforeRouteEnter
์next
์ ๋๊ฒจ์ค ์ฝ๋ฐฑ ํธ์ถ
# ๋ค๋น๊ฒ์ด์ ๊ฐ๋๋ก ์ธ์ฆ ์ ๋ณด ํ์ธ
๋ค๋น๊ฒ์ด์ ๊ฐ๋๊ฐ ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ ๊ณณ์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด์ ๋ฐ๋ผ ์ ๊ทผ์ ๋ง๋ ๋ก์ง์ ๋๋ค.
router.beforeEach(function(to, from, next) {
// to: ์ด๋ํ url์ ํด๋นํ๋ ๋ผ์ฐํ
๊ฐ์ฒด
if (
to.matched.some(function(routeInfo) {
return routeInfo.meta.authRequired;
})
) {
// ์ด๋ํ ํ์ด์ง์ ์ธ์ฆ ์ ๋ณด๊ฐ ํ์ํ๋ฉด ๊ฒฝ๊ณ ์ฐฝ์ ๋์ฐ๊ณ ํ์ด์ง ์ ํ์ ํ์ง ์์
alert("Login Please!");
} else {
console.log("routing success : '" + to.path + "'");
next(); // ํ์ด์ง ์ ํ
}
});
# ์ฐธ๊ณ ์๋ฃ
โ Code Splitting Transition & Animation โ