Skip to content

Drawer 抽屉

抽屉组件用于在屏幕上显示临时内容,从而提供额外的操作或信息。

基本用法

通过 NueDrawer 组件创建一个抽屉。

需要传入一个 v-model:visible 的响应式属性,用于控制抽屉的显示和隐藏。

通过 title 属性设置抽屉的标题,接受一个 String 类型的值。

<template>
    <nue-button @click="drawerState = true">打开抽屉</nue-button>
    <teleport to="body">
        <nue-drawer v-model:visible="drawerState" title="抽屉标题">
            <nue-text>抽屉内容</nue-text>
        </nue-drawer>
    </teleport>
</template>

<script setup>
    import { ref } from 'vue';

    const drawerState = ref(false);
</script>

打开方向

通过属性 open-from 设置抽屉组件打开的方向。

open-form 属性值必须是 leftright*topbottom 中的一个。

  • * 表示属性默认值。
<template>
    <nue-div>
        <nue-button @click="handleOpenDrawer('top')">
            打开抽屉(上)
        </nue-button>
        <nue-button @click="handleOpenDrawer('bottom')">
            打开抽屉(下)
        </nue-button>
        <nue-button @click="handleOpenDrawer('left')">
            打开抽屉(左)
        </nue-button>
        <nue-button @click="handleOpenDrawer('right')">
            打开抽屉(右)
        </nue-button>
    </nue-div>
    <teleport to="body">
        <nue-drawer
            v-model:visible="drawerState"
            :open-from="drawerOpenFrom"
            title="抽屉标题"
        >
            <nue-text>抽屉内容</nue-text>
        </nue-drawer>
    </teleport>
</template>

<script setup>
    import { ref } from 'vue';

    const drawerState = ref(false);
    const drawerOpenFrom = ref('left');

    const handleOpenDrawer = openFrom => {
        drawerOpenFrom.value = openFrom;
        drawerState.value = true;
    };
</script>

自定义头部、主体以及底部

通过指定插槽完成对应内容的自定义。

  • header 插槽用于自定义抽屉的头部内容。头部插槽可以解构出 close 方法用于关闭抽屉。
  • default 默认插槽用于自定义抽屉的主体内容。
  • footer 插槽用于自定义抽屉的底部内容。
<template>
    <nue-button @click="drawerState = true">打开抽屉</nue-button>
    <teleport to="body">
        <nue-drawer v-model:visible="drawerState" title="抽屉标题">
            <template #header="{ close }">
                <nue-text>自定义头部</nue-text>
                <nue-button @click="close">关闭抽屉</nue-button>
            </template>
            <template #default>
                <nue-text>自定义主体</nue-text>
            </template>
            <template #footer>
                <nue-text>自定义底部</nue-text>
            </template>
        </nue-drawer>
    </teleport>
</template>

<script setup>
    import { ref } from 'vue';

    const drawerState = ref(false);
</script>

展开范围以及最小展开范围

通过属性 spanmin-span 分别设置抽屉的展开范围以及最小展开范围。

spanmin-span 属性接收 string 类型的值,具体应用到 CSS 的 widthheightmin-widthmin-height 这些属性上。

TIP

由于抽屉的开启方向可以是上下左右四个方向,因此在上下方向时,spanmin-span 分别指的是高度和最小高度;在左右方向时,spanmin-span 分别指的是宽度和最小宽度。

TIP

spanmin-span 的效果会在视口发生变化时体现出来。

<template>
    <nue-button @click="drawerState = true">打开抽屉</nue-button>
    <teleport to="body">
        <nue-drawer
            v-model:visible="drawerState"
            title="抽屉标题"
            span="50%"
            min-span="360px"
        >
            <nue-text>抽屉内容</nue-text>
        </nue-drawer>
    </teleport>
</template>

<script setup>
    import { ref } from 'vue';

    const drawerState = ref(false);
</script>

仅允许通过关闭按钮关闭

抽屉组件默认允许点击抽屉以外的区域触发关闭动作,通过属性 close-by-button-only 设置仅允许通过关闭按钮关闭。

<template>
    <nue-button @click="drawerState = true">打开抽屉</nue-button>
    <teleport to="body">
        <nue-drawer
            v-model:visible="drawerState"
            title="抽屉标题"
            span="50%"
            min-span="360px"
            close-by-button-only
        >
            <nue-text>抽屉内容</nue-text>
        </nue-drawer>
    </teleport>
</template>

<script setup>
    import { ref } from 'vue';

    const drawerState = ref(false);
</script>

设置关闭前的回调函数

通过属性 before-close 设置关闭前的回调函数,该函数会在抽屉关闭之前执行。

回调函数在被调用时会传入一个 finish 函数,只有在调用该函数后才会执行抽屉的关闭操作。

<template>
    <nue-button @click="drawerState = true">打开抽屉</nue-button>
    <teleport to="body">
        <nue-drawer
            v-model:visible="drawerState"
            title="抽屉标题"
            :before-close="beforeCloseDrawer"
        >
            <nue-text>抽屉内容</nue-text>
        </nue-drawer>
    </teleport>
</template>

<script setup>
    import { ref } from 'vue';
    import { NueConfirm } from 'nue-ui';

    const drawerState = ref(false);

    const beforeCloseDrawer = finish => {
        const confirmOptions = {
            title: '关闭确认',
            content: '确认是否关闭抽屉',
            confirmButtonText: '确认',
            cancelButtonText: '取消'
        };
        NueConfirm(confirmOptions)
            .then(() => finish())
            .catch(() => {});
    };
</script>

连续打开多个抽屉

抽屉组件可以连续使用,在同一个页面上可以打开多个抽屉,这些抽屉元素会根据打开顺序进行显示而非文档结构。

<template>
    <nue-div>
        <nue-button @click="drawer1State = true">打开抽屉1</nue-button>
        <nue-button @click="drawer2State = true">打开抽屉2</nue-button>
    </nue-div>
    <teleport to="body">
        <nue-drawer
            v-model:visible="drawer1State"
            title="抽屉1"
            span="50%"
            min-span="360px"
        >
            <nue-button @click="drawer2State = true">打开抽屉2</nue-button>
        </nue-drawer>
        <nue-drawer
            v-model:visible="drawer2State"
            title="抽屉2"
            open-from="left"
        >
            <nue-button @click="drawer1State = true">打开抽屉1</nue-button>
        </nue-drawer>
    </teleport>
</template>

<script setup>
    import { ref } from 'vue';

    const drawer1State = ref(false);
    const drawer2State = ref(false);
</script>

Released under the MIT License.