this.$router.push(url)

Nuxt.js는 자동으로 라우터 객체를 만들어 주어서 우리가 컴포넌트 안에서 this.$router로 라우터 객체에 접근할 수 있다. this.$router.push(url)은 인자로 받은 url로 이동하라는 의미이다.

<template lang="">
  <div class="app">
    <main>
      <div>
        <input type="text" />
      </div>
      <ul>
        <li
          class="item flex"
          v-for="product in products"
          :key="product.id"
          **@click="moveToDetailPage(product.id)"**
        >
          <img
            class="product-image"
            :src="product.imageUrl"
            :alt="product.name"
          />
          <p>{{ product.name }}</p>
          <span>{{ product.price }}</span>
        </li>
      </ul>
    </main>
  </div>
</template>
<script>
import axios from 'axios'

export default {
  name: 'IndexPage',
  ...
  methods: {
    **moveToDetailPage**(id) {
      **this.$router.push(`detail/${id}`)**
    },
  },
}
</script>
<style scoped>
</style>

이미지를 클릭하면 moveToDetailPage 메서드에 의해 datail/${id} url로 이동하게 된다.

pages/_param.vue

_는 이 값이 파라미터라는 것을 의미한다. 그리고 _ 뒤의 param 값은 우리가 넘겨줄 파라미터 값이다. 즉, 파라미터로 넘겨지는 값을 url로 하는 페이지를 만들 수 있다는 말!

우리는 위에서 datail/${id} url로 이동하기로 했으므로 디렉토리 구조를 다음과 같이 짠다.

pages
|_ **detail**
   |_ **_id.vue**

그리고 _id.vue에서 created() 시 this.$route를 찍어 제대로 찍히는지 확인해본다.

<template lang="">
  <div>
    <h1>상세 페이지</h1>
  </div>
</template>
<script>
export default {
  created() {
    **console.log(this.$route)
		const id = this.$route.params.id**
  },
}
</script>
<style></style>

api 만들기

@/api 디렉토리 밑에 fetch.js라는 파일을 만든다. 여기서 공통적으로 사용할 수 있는 api 함수를 선언해 줄 것이다.

import axios from 'axios'

/* 간단한 axios 인스턴스 생성 */
const instance = axios.create({
  baseURL: '<http://localhost:3000>',
})

function fetchProductById(id) {
  return instance.get(`products/${id}`)
}

export { fetchProductById }

이 함수는 만약 우리가 서버의 url인 http://localhost:3000/products/${id}로 들어가게 되면 id에 해당하는 물품의 정보를 받아올 수 있기 때문에 작성한 것이다.

asyncData의 context 파라미터

Data Fetching | Cracking Vue.js