Props

채윤·2022년 6월 19일
0

Vue-Components In-Depth

목록 보기
2/4

Props

부모 컴포넌트에서 자식 컴포넌트로 데이터 전달하는 방법이다.

Props 선언

export default {
  props: ['foo'],
}

문자열 배열 형태로 작성된 prop의 리스트도 가능하고,

export default {
  props: {
    title: String,
    likes: Number
  }
}

prop에 특정 타입의 값을 넣고 싶은 경우에는 속성 이름, 타입을 포함하는 오브젝트로 선언해서 타입이 지정된 prop의 리스트를 구현할 수도 있다.

이는 컴포넌트를 읽기 좋게 문서화할 뿐 아니라, 콘솔에서도 잘못된 타입이 전달된 경우 경고를 띄워준다.

정적 vs 동적 prop 전달하기

아래와 같이 정적인 props를 전달할 수 있다.

<BlogPost title="My journey with Vue" />

또는 아래와 같이 v-bind or :를 이용해 동적인 prop을 전달할 수도 있다.

<!-- Dynamically assign the value of a variable -->
<BlogPost :title="post.title" />

<!-- Dynamically assign the value of a complex expression -->
<BlogPost :title="post.title + ' by ' + post.author.name" />

다른 값 유형 전달

숫자(Number)

<!-- 42는 정적인 값이지만, 숫자라는 것을 알려주기 위해 v-bind를 이용한다. -->
<BlogPost :likes="42" />

<!-- 변수의 값을 동적으로 할당할 수도 있다. -->
<BlogPost :likes="post.likes" />

Array, Boolean, Object도 숫자가 마찬가지로 정적인 props, v-bind를 사용한 동적 할당 두가지 모두 가능하다.

오브젝트의 속성 전달
오브젝트의 모든 속성을 전달하려면, v-bind만 작성하면 모든 속성을 prop으로 전달할 수 있다.

export default {
  data() {
    return {
      post: {
        id: 1,
        title: 'My Journey with Vue'
      }
    }
  }
}
<BlogPost v-bind="post" />

post로 작성된 것은 아래와 같이 동작한다.

<BlogPost :id="post.id" :title="post.title" />

단방향 데이터 흐름

  • 모든 prop들은 부모 -> 자식으로 단방향으로 내려간다.
  • 부모 속성이 변경되면 자식 속성에 전달되지만, 반대 방향으로는 안된다.
  • 부모가 변경될 때마다 자식의 prop이 최신 값으로 업데이트 되므로 prop은 자식 컴포넌트에서 수정하면 안된다.

prop을 직접 변경하고 싶을 때

1. prop은 초기값만 전달하고, 자식 컴포넌트는 그 초깃값을 로컬 데이터 속성으로 활용하고 싶은 경우

export default {
  props: ['initialCounter'],
  data() {
    return {
      counter: this.initialCounter
    }
  }
}

2. 전달된 prop 형태를 바꿔야 하는 경우

export default {
  props: ['size'],
  computed: {
    normalizedSize() {
      return this.size.trim().toLowerCase()
    }
  }
}

computed를 사용해서 변경사항을 감시하고 반영된다.

오브젝트, 배열을 prop으로 전달할 경우에는 객체를 참조하게 되므로 수정을 하게 되면 자식 요소가 부모 요소의 상태를 변경을 하게 된다.

profile
프론트엔드 개발자

0개의 댓글

관련 채용 정보