v-on
이벤트 리스너를 전달하고 이것을 받는 컴포넌트의 props
또는 emits
에 선언하지 않는 속성class
, style
, id
속성이 있다.<MyButton>
의 템플릿이 아래와 같이 구성되어 있다.<!-- <MyButton>의 템플릿 -->
<button>클릭하기</button>
<MyButton>
컴포넌트에 class
속성을 추가하면,<MyButton class="large" />
<MyButton>
템플릿은 아래와 같다.<button class="large">클릭하기</button>
💡 class
, style
, id
모두 동일하게 병합된다.
v-on
리스너를 작성하였는데 부모 컴포넌트에서 해당 컴포넌트를 선언할 때 v-on
리스너를 작성할 수 있다.<MyButton @click="onClick" />
inheritAttrs
옵션을 false
로 지정하여 컴포넌트가 자동으로 속성을 상속하지 않게 한다.export default {
inheritAttrs: false
}
$attrs
객체에는 컴포넌트 props
또는 emits
옵션으로 선언되지 않은 모든 속성이 포함된다.<p>폴스루 속성 : {{ $attrs }}</p>
<!-- 위 <MyButton> 예시로 출력하면 아래와 같은 결과가 나온다. -->
<!-- 폴스루 속성 : { "class": "large" } -->
props
와 달리 폴스루 속성은 자바스크립트에서 작성하는 표기법대로 작성한다.$attrs['foo-bar']
, $attrs.onClick
<MyButton>
예시처럼 <button>
단일 엘리먼트가 아닌 추가 래핑하는 경우<div>
가 아닌 내부 <button>
에 적용을 원할 때 inheritAttrs: false
로 설정하고, v-bind="$attrs"
로 이를 구현할 수 있다.<!-- MyButton.vue -->
<template>
<div>
<button v-bind="$attrs">클릭하기</button>
</div>
</template>
<script>
export default {
inheritAttrs: false,
...
}
</script>
<header>...</header>
<main>...</main>
<footer>...</footer>
$attrs
를 명시적으로 바인딩하면 경고가 발생하지 않는다.<header>...</header>
<main v-bind="$attrs">...</main>
<footer>...</footer>
$attrs
인스턴스 속성을 통해 폴스루 속성에 접근할 수 있다.export default {
created() {
console.log(this.$attrs)
}
}