본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

Drawer 드로어

원문 보기 위키 갱신

화면 가장자리에서 미끄러지듯 나오는 플로팅 패널 컴포넌트예요.

출처: 문서

본문

화면 가장자리에서 슬라이드로 나타나는 플로팅 패널 컴포넌트예요.

언제 사용하나요?

  1. 드로어가 부모 창 가장자리에서 슬라이드 인해 부모 창 내용의 일부를 덮어요. 사용자는 드로어 안에서 작업하더라도 현재 작업을 떠날 필요가 없고, 작업이 끝나면 부드럽게 원래 작업으로 돌아올 수 있어요.
  2. 부모 창의 내용을 제어할 추가 패널이 필요하고, 이 패널을 필요할 때 불러내고 싶을 때 사용해요. 예를 들어 화면 표시 스타일을 바꾸거나 화면에 내용을 추가하는 경우예요.
  3. 현재 작업 흐름 속에 임시 작업을 끼워 넣거나, 추가 내용을 만들거나 미리 보고 싶을 때 사용해요. 예를 들어 약관을 보여 주거나 하위 객체를 만드는 경우예요.

기본 사용법

:::demo 기본적으로 오른쪽에서 슬라이드 아웃하며 너비는 300px이에요.

<template>
  <d-button variant="solid" color="primary" @click="showDrawer">Click Me</d-button>
  <d-drawer v-model="visible" style="padding: 20px;">Hello Drawer</d-drawer>
</template>
<script>
import { defineComponent, ref } from 'vue';

export default defineComponent({
  setup() {
    const visible = ref(false);
    const showDrawer = () => (visible.value = true);

    return { visible, showDrawer };
  },
});
</script>

:::

왼쪽에서 나오기

:::demo position으로 왼쪽에서 슬라이드 아웃하게 설정해요.

<template>
  <d-button variant="solid" color="primary" @click="showDrawer">Click Me</d-button>
  <d-drawer v-model="visible" position="left" style="padding: 20px;">Left Drawer</d-drawer>
</template>
<script>
import { defineComponent, ref } from 'vue';

export default defineComponent({
  setup() {
    const visible = ref(false);
    const showDrawer = () => (visible.value = true);

    return { visible, showDrawer };
  },
});
</script>

:::

배경 스크롤

:::demo drawer가 슬라이드 아웃된 뒤에는 기본적으로 배경 스크롤이 잠기는데, lock-scroll을 false로 설정하면 잠금을 풀 수 있어요.

<template>
  <d-button variant="solid" color="primary" @click="showDrawer">Click Me</d-button>
  <d-drawer v-model="visible" :lock-scroll="false" style="padding: 20px;">Background can be scrolled</d-drawer>
</template>

<script>
import { defineComponent, ref } from 'vue';

export default defineComponent({
  setup(props, ctx) {
    const visible = ref(false);
    const showDrawer = () => (visible.value = true);

    return { visible, showDrawer };
  },
});
</script>

:::

닫기 전 콜백

:::demo before-close는 사용자가 drawer를 닫을 때 호출돼요. 비동기 작업을 마친 뒤 done 함수를 실행해 닫을 수 있어요.

<template>
  <d-button variant="solid" color="primary" @click="showDrawer">Click Me</d-button>
  <d-drawer v-model="visible" :before-close="onBeforeClose" style="padding: 20px;">Delay Close</d-drawer>
</template>

<script>
import { defineComponent, ref } from 'vue';

export default defineComponent({
  setup() {
    const visible = ref(false);
    const showDrawer = () => (visible.value = true);
    const onBeforeClose = (done) => {
      new Promise((resolve) => {
        setTimeout(resolve, 1000);
      }).then(done);
    };

    return { visible, showDrawer, onBeforeClose };
  },
});
</script>

:::

서비스 방식

:::demo 컴포넌트는 전역에 $drawerService를 등록해 두었기 때문에 서비스 방식으로도 사용할 수 있어요. drawer의 내용은 content 파라미터로 넘겨요. 서비스는 drawer를 닫는 데 쓰는 close 메서드를 반환해요.

<template>
  <d-button variant="solid" color="primary" @click.native="showDrawer()">서비스 방식</d-button>
</template>

<script>
import { defineComponent, h } from 'vue';

export default defineComponent({
  setup() {
    function showDrawer() {
      this.$drawerService.open({
        content: () => h('div', { style: { padding: '20px' } }, [h('span', {}, ['Open drawer board in service mode'])]),
      });
    }

    return { showDrawer };
  },
});
</script>

:::

Drawer 파라미터

파라미터 타입 기본값 설명 Demo 링크
v-model Boolean false 선택, drawer 표시 여부 설정 기본 사용법
position String right 선택, drawer가 나타나는 위치. 'left' 또는 'right' 왼쪽에서 나오기
show-overlay Boolean true 선택, 오버레이(마스크) 레이어 표시 여부 기본 사용법
lock-scroll Boolean true 선택, 스크롤 잠금 여부 배경 스크롤
z-index Number 1000 선택, drawer의 z-index 값 설정 기본 사용법
esc-key-closeable Boolean true 선택, esc 키로 drawer를 닫을 수 있는지 설정 기본 사용법
close-on-click-overlay Boolean true 선택, 배경 클릭으로 drawer를 닫을 수 있는지 설정 기본 사용법
before-close (done) => void - 선택, 창을 닫기 전의 콜백. done을 호출하면 drawer가 닫혀요 닫기 전 콜백

Drawer 이벤트

이벤트명 타입 설명
open - drawer가 열릴 때 발생해요
close - drawer가 닫힐 때 발생해요

Drawer 슬롯

슬롯명 타입 설명 Demo 링크
default 기본 drawer 내용 기본 사용법

더 알아보기 (Learn more)

d-drawer는 화면 가장자리에서 나오는 보조 패널로, 설정 화면이나 약관 미리 보기처럼 현재 작업을 벗어나지 않고 부가 작업을 처리할 때 좋아요. before-close를 쓰면 저장 같은 비동기 처리가 끝난 뒤에 닫히도록 흐름을 제어할 수 있어요.