const router = createRouter({
history: createWebHistory(),
routes: [
{ path: '/', redirect: '/products' },
{ path: '/products', component: AllProducts },
{ path: '/products/:pid', component: ProductDetails },
{ path: '/products/add', component: AddProduct }
]
});
기존에 위와같은 route.js가 있었다면 ProductDetails
컴포넌트에서는 this.route는 접근할 수 없는 것이다.
그러다면 어떻게 접근하면 될까?
const router = createRouter({
history: createWebHistory(),
routes: [
{ path: '/', redirect: '/products' },
{ path: '/products', component: AllProducts },
{ path: '/products/:pid', component: ProductDetails, props:true},
{ path: '/products/add', component: AddProduct }
]
});
<script setup>
import {defineProps, inject} from 'vue';
const props = defineProps({
pid:String
})
const products = inject('products');
const selectedProduct = products.value.find((product)=>product.id===props.pid)
const title = selectedProduct.title;
const price = selectedProduct.price;
const description = selectedProduct.description;
</script>
그러데 만약 아래와 같은 코드가 있다고 해보자
<template>
<section>
<h2>{{ title }}</h2>
<h3>${{ price}}</h3>
<p>{{ description}}</p>
<router-link to="/products/p2">Product P2</router-link>
</section>
</template>
import {computed, defineProps, inject} from 'vue';
const props = defineProps({
pid:String
})
const products = inject('products');
const selectedProduct = computed(()=>products.value.find((product)=>product.id===props.pid))
const title = computed(()=>selectedProduct.value.title);
const price = computed(()=>selectedProduct.value.price);
const description = computed(()=>selectedProduct.value.description);
만약 단순 route가 아니라 query나 path를 알고싶으면 어떻게 해야할까?
바로 vue-router 라이브러리에 내장된 훅 또는 composable을 사용하면 된다.
composable은 뭘까? 특별한 종류의 함수를 가르킨다.
훅, 컴포저블 사용자 지정 컴포지션 함수는 JavaScript로 쓰인 특별한 함수로 컴포지션 API에 내장되어 있다.
따라서 setup 메서드 내부에서 사용되며 이 함수들은 보통 내부적으로 참조(ref)와 연산(computed)과 같은 컴포지션 API 기능을 사용한다.
import { useRoute } from 'vue-router';
const route = useRoute();
console.log(route);
watch
나 computed
프로퍼티를 사용하여 라우트가 변경될 때 여기에 의존하는 데이터를 업데이트할 수 있다.import {computed, inject} from 'vue';
import { useRoute } from 'vue-router';
const route = useRoute();
const products = inject('products');
const selectedProduct = computed(()=>products.value.find((product)=>product.id===route.params.pid))
const title = computed(()=>selectedProduct.value.title);
const price = computed(()=>selectedProduct.value.price);
const description = computed(()=>selectedProduct.value.description);
useRoute
가 아닌 useRouter
가 필요하다<script>
import { ref, inject } from 'vue';
import {useRouter} from "vue-router";
export default {
setup() {
const addProduct = inject('addProduct');
const router = useRouter();
const enteredTitle = ref('');
const enteredPrice = ref(null);
const enteredDescription = ref('');
function submitForm() {
addProduct({
title: enteredTitle,
description: enteredDescription,
price: enteredPrice,
});
router.push('/products');
}
return {
enteredTitle,
enteredPrice,
enteredDescription,
submitForm,
};
},
};
</script>