데일리 공부 기록

hands on vue3 - router 관련 퀴즈 풀어보기(router-link에 변수사용하기)

탐훈 2023. 3. 23. 23:28
728x90

[목표]

<router-link to="경로">

위와 같이 경로에 직접 URL 경로를 썼었다.

이제는 javascript 변수를 사용하여 동적으로 이용해보자

 

주어진 소스는 아래의 링크에서

얻을 수 있다.

https://tomhoon.tistory.com/390

 

hands on vue3 - 주어진 소스를 보고 router에 대한 문제를 풀어봐라(router 파라미터사용하기)

[목표] router로 설정된 path 뒤에 파라미터가 올 수 있다. 그 파라미터들을 queryString이라고도 하는데 vue에서는 어떻게 쿼리스트링을 사용할 것인지에 대해 살펴보자. 먼저 주어진 소스를 보고 조건

tomhoon.tistory.com

 

버튼을 클릭하면

해당하는 팀의 멤버를 보여주는 기능을 구현해보기

 


[TeamsList.vue]

<template>
  <ul>
    <teams-item
      v-for="team in teams"
      :key="team.id"
      :id="team.id"
      :name="team.name"
      :member-count="team.members.length"
    ></teams-item>
  </ul>
</template>

<script>
import TeamsItem from './TeamsItem.vue';

export default {
  components: {
    TeamsItem,
  },
  inject: ['teams'],
};
</script>

<style scoped>
ul {
  list-style: none;
  margin: 2rem auto;
  max-width: 40rem;
  padding: 0;
}
</style>

[TeamsItem.vue]

<template>
  <li>
    <h3>{{ name }}</h3>
    <div class="team-members">{{ memberCount }} Members</div>
    <router-link :to="'/teams/' + id">View Members</router-link>
  </li>
</template>

<script>
export default {
  props: ['id','name', 'memberCount'],
};
</script>

<style scoped>
li {
  margin: 1rem 0;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
  border-radius: 12px;
  padding: 1rem;
}

li h3 {
  margin: 0.5rem 0;
  font-size: 1.25rem;
}

li .team-members {
  margin: 0.5rem 0;
}

a {
  text-decoration: none;
  color: white;
  display: inline-block;
  padding: 0.5rem 1.5rem;
  background-color: #11005c;
}

a:hover,
a:active {
  background-color: #220a8d;
}
</style>

 

수정된 소스는 두 개다.

수정된 소스에 대해 살펴보자

 

<router-link v-bind:to="'/teams/' + id">View Members</router-link>
router link 태그에 v-bind를 이용하여 
동적으로 변화시켰다. 
 
또 다른 방법으로는 
<template>
  <li>
    <h3>{{ name }}</h3>
    <div class="team-members">{{ memberCount }} Members</div>
    <router-link :to="viewMembers">View Members</router-link>
  </li>
</template>

<script>
export default {
  props: ['id','name', 'memberCount'],
  computed:{
    viewMembers(){
      let path = "/teams/" + this.id;
      return path;
    }
  }
};
</script>

메소드를 생성하여

v-bind:to 에 바인딩 시켜주면 된다. 

 

주의할 점은 

computed가 아닌

methods에 선언하면 작동을 하지 않는다. 

 

method에 선언하면 안되는 이유는

아마도 props에 대한 데이터가 

오지도 않았는데 메소드를 생성하고 메소드 내에 변수로 선언했다면

아마 빈값을 가리키고 있기 때문이지 않을까? 

 

나중에 명확히 알고 다시 설명을 써야겠다!