컴포넌트의 템플릿, refs
키워드에 대해 살펴보도록 합시다. 더욱 자세한 사항은 공식 문서를 참고해주시기 바랍니다.
비록 props
와 이벤트가 존재하지만, 가끔은 자식 요소에 JavaScript를 이용해 직접 접근해야 하는 경우가 있습니다. 이 경우, ref
속성을 이용해 레퍼런스 ID를 자식 컴포넌트나 HTML 요소에 부여함으로써 직접 접근할 수 있습니다.
mounted() {
const h1El = document.querySelector('#hello')
console.log(h1El.textContent)
}
원래의 경우라면 위와 같이 DOM API를 사용하게 됩니다. 하지만 참조하겠다는 의미의ref
라는 속성을 사용하면 해당 기능을 간단하게 사용할 수 있습니다.
App.vue
<h1 ref="hello">Hello world!</h1>
export default { mounted() { console.log(this.$refs.hello.textContent) } }
위의 예시처럼 Vue에서 제공하는 ref
라는 속성을 통해 해당 요소를 참조할 수 있습니다. 그리고 그 참조된 내용은 Vue의 $refs
라는 객체에 해당하는 hello라는 이름으로 들어가서 저장이 되는 구조를 갖고 있습니다.
다만, HTML과 연결된 직후만 사용이 가능하므로 created()
라는 라이프사이클에서는 사용이 불가합니다.
App.vue(부모 컴포넌트)
<Hello ref="hello" />
import Hello from '~/components/Hello' export default { components: { Hello }, mounted() { console.log(this.$refs.hello.$el) } } </script>
Hello.vue(자식 컴포넌트)
<h1>Hello~</h1>
이렇게 컴포넌트를 ref라는 속성으로 어떠한 이름(hello
)으로 참조를 할 경우에는 참조된 이름(hello
) 뒤쪽에 $el
을 명시해줘야만 해당하는 내용을 참조할 수 있습니다.
그러나 여기서도 마찬가지로 컴포넌트의 최상위 요소가 2개 이상이라면 $el
속성으로 어떠한 요소를 바라봐야하는지 알 수 없게 됩니다.
App.vue(부모 컴포넌트)
export default { components: { Hello }, mounted() { console.log(this.$refs.hello.$refs.good) } }
Hello.vue(자식 컴포넌트)
<h1>Hello~</h1> <h1 ref="good">Good?</h1>
이러한 경우에는 자식 컴포넌트에 ref
라는 속성에 이름을 명시하고 부모 컴포넌트에는 $el
이 아닌 $refs
의 속성에 자식 컴포넌트에 명시한 이름을 코딩해주면 됩니다.