Vue.Js 3 Composition API 살펴보기 - 5(Teleport)
하수도키
·2020. 10. 28. 00:01
728x90
반응형
SMALL
Vue3 Composition API에 대해 알아보자
Vue3가 나오면서 Composition API가 제공되고 있다. Composition API가 왜 나왔는지 알아보고 뭔지 알아보자.
개요
- Teleport
Teleport
- Vue 컴포넌트 설계는 비지니스 로직 계층과 표현 계층으로 구축할 수 있다. 그러나 때때로 특정한 위치에 html 렌더링을 시켜야 되는 컴포넌트가 있을 수가 있다.
- 예를 들면,
absolute, fixed, z-index
를 활용하믄 모달 팝업,</body>
태그앞에 와야 되는 경우 - Vue 애플리케이션 페이지에서 작은 부분(또는 widget)에서 실행 될때, Vue app밖에 있는 DOM으로 이동하고 싶은 경우
- 예를 들면,
해결
Teleport
컴포넌트를 사용해보자.Portal
이라고 불렸으나Teleport
로 변경되었다. (portal이 html태그가 될수가 있어서)Teleport
사용하면 DOM의 다룬 부분을 보낼 수 있는 템플릿 html를 생성 할 수 있다.- Vue app 밖에 있는
div
태그에 추가해보는 예제를 살펴보자.
/public/index.html
...
<div id="app"></div>
<div id="end-of-body"></div>
</body>
</html>
- Vue app 내부에서 외부
#end-of-body
로 텍스트를 이동시켜 보자.
<template>
<teleport to="#end-of-body">
This should be at the end.
</teleport>
<div>
This should be at the top.
</div>
</template>
- Teleport된 html를 보면 하단에 위치해있다. 원하는대로 잘 이동한걸 볼 수 있다.
Teleport 옵션 to 를 알아보자.
to
는 DOM 쿼리 셀럭터만 올 수 있다.
<teleport to="#some-id"> // id selector
<teleport to=".some-class"> // class selector
<teleport to="[data-modal]"> // data selector
<teleport :to="reactiveProperty"> // dynamic selector
Disabled State
- 모달 팝업 같은 경우 처음에는 보여지지 않고 실행되었을때만 보여진다.
Teleport
는disabled
상태를 제공해 컴포넌트에서 숨겨져 있다가 실행될때 타겟 위치에서 보이게 조절이 가능하다.
<template>
<teleport to="#end-of-body" :disabled="!showText">
This should be at the end.
</teleport>
<div>
This should be at the top.
</div>
<button @click="showText = !showText">
Toggle showText
</button>
</template>
<script>
export default {
data() {
return {
showText: false
};
}
};
</script>
showText
로 초기값을false
로 할당하여:disabled
를 활성화 시켜서 보이지 않게 했다.- 버튼을 클릭하면
Teleport
가 타겟 DOM으로 가서 보여지게 된다.
- 실행되기전에는
end
구문이 맨위에 있고 버튼 누르고 작동되니 하단에 위치하는것을 볼 수 있다. - 개발자도구로 살펴보면 DOM안에 컴텐츠가 이동하는것을 볼 수 있다.
State 자동 저장
Teleport
가 비활성화에서 활성활 될때, DOM elements는 재사용 되므로 상태를 완벽히 유지한다.- 비디오 태그로 예제를 들면서 살펴보자.
<template>
<teleport to="#end-of-body" :disabled="!showText">
<video autoplay="true" loop="true" width="250">
<source src="flower.webm" type="video/mp4">
</video>
</teleport>
<div>
This should be at the top.
</div>
<button @click="showText = !showText">
Toggle showText
</button>
</template>
<script>
export default {
data() {
return {
showText: false
};
}
};
</script>
- 꽃이 피어오르는 동영상이 멈추거나 처음 시작 부분에서 재생하는것이 아니고 계속 상태가 유지된다.
텍스트 숨기기
- 모달을 사용하려면 처음에는 보여지지 말아야 한다. 이럴땐
v-if
를 사용한다.
<template>
<teleport to="#end-of-body" :disabled="!showText" v-if="showText">
This should be at the end.
</teleport>
...
같은 장소에 멀티 Teleport 사용하기
- 같은 장소에 2개의
Teleport
를 사용할 경우에는 먼저 실행되는Teleport
를 추가하고 그다음 실행되는Teleport
는 뒤에 추가한다.
<template>
<teleport to="#end-of-body" :disabled="!showText" v-if="showText">
This should be at the end.
</teleport>
<teleport to="#end-of-body" :disabled="!showText2" v-if="showText2">
This should be at the end too.
</teleport>
<div>
This should be at the top.
</div>
<button @click="showText = !showText">
Toggle showText
</button>
<button @click="showText2 = !showText2">
Toggle showText2
</button>
</template>
<script>
export default {
data() {
return {
showText: false,
showText2: false
};
}
};
</script>
결론
- 이 포스팅을 마지막으로 Vuejs3 Composition API는 마칩니다. 짝짝짝
참조
728x90
반응형
LIST
'개발일기 > Vue.js' 카테고리의 다른 글
[Vue.js] 토큰 기반 인증(#5. 유저 로그아웃) (0) | 2020.10.30 |
---|---|
[Vue.js] 토큰 기반 인증(#4. 유저 로그인) (0) | 2020.10.28 |
Vue.Js 3 Composition API에 대해 알아보자 - 4(Sharing State, Suspense) (1) | 2020.10.26 |
Vue.Js 3 Composition API 살펴보기 - 3(Modularzing, LifeCycle Hooks, Watch) (1) | 2020.10.26 |
Vue.Js 3 Composition API 살펴보기 - 2(Methods, Computed, The Reactive Syntax) (0) | 2020.10.23 |