封装element-plus中的Drawer组件

<template>
    <el-drawer v-model="showDrawer" 
    :title='title' 
    :size="size" 
    :close-on-click-modal="false"
    :destroy-on-close="destoryOnClose">
        <div class="formDrawer">
            <div class="body">
                <slot></slot>
            </div>
            <div class="actions">
                <el-button type="primary" @click="submit" :loading="loading">{{ confireText }}</el-button>
                <el-button type="default" @click="closeDrawer">取消</el-button>
            </div>
        </div>
    </el-drawer>
</template>
<script setup>
    import {ref} from 'vue'
    const showDrawer = ref(false)

    //按钮loading效果
    const loading = ref(false)
    const showLoding = ()=> loading.value = true
    const hideLoding = ()=> loading.value = false
    
    //父组件需要自己设置的值
    const props = defineProps({
        title: {
            type: String,
        },
        size: {
            type: String,
            default: '45%'
        },
        //控制是否在关闭 Drawer 之后将子元素全部销毁
        destoryOnClose: {
            type: Boolean,
            default: false
        },
        confireText: {
            type: String,
            default: '提交'
        }
    })

    //打开抽屉方法
    const openDrawer = () => {
        showDrawer.value = true
    }

    //关闭抽屉方法
    const closeDrawer = () => {
        showDrawer.value = false
    }

    //提交
    const emit = defineEmits(['submit'])
    const submit = ()=>{
        emit('submit')
    }

    //向父组件暴露以下方法
    defineExpose({
        openDrawer,
        closeDrawer,
        showLoding,
        hideLoding
    })
</script>
<style>
    .formDrawer {
        display: flex;
        position: relative;
        flex-direction:column;
        width: 100%;
        height: 100%;
    }
    .formDrawer .body {
        flex: 1;
        overflow-y: auto;
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        bottom: 50px;
    }
    .formDrawer .actions{
        display: flex;
        align-items: center;
        height: 50px;
        margin-top: auto;
        /* background-color: skyblue; */
    }
</style>

效果:底部按钮固定,中间内容超出可以滚动

 父组件引入使用,中间部分插槽可以写很多内容,比如表单等:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用 Vue3 和 Element Plus 的 Drawer 组件封装一个抽屉组件。首先需要在组件引入 Drawer 组件,然后在模板使用 Drawer 组件的属性和事件来实现抽屉的展示和隐藏。 以下是一个简单的抽屉组件的代码示例: ```vue <template> <el-drawer :visible="visible" :title="title" :size="size" :direction="direction" :before-close="beforeClose" @open="handleOpen" @close="handleClose" > <slot></slot> </el-drawer> </template> <script> import { ref } from 'vue'; import { ElDrawer } from 'element-plus'; export default { name: 'MyDrawer', components: { ElDrawer, }, props: { visible: { type: Boolean, default: false, }, title: { type: String, default: '', }, size: { type: String, default: '30%', }, direction: { type: String, default: 'rtl', }, }, setup(props, { emit }) { const beforeClose = (done) => { // 可以在这里添加关闭前的逻辑 done(); }; const handleOpen = () => { emit('update:visible', true); }; const handleClose = () => { emit('update:visible', false); }; return { beforeClose, handleOpen, handleClose, }; }, }; </script> ``` 在父组件使用该抽屉组件时,可以通过 v-model 来控制抽屉的显示和隐藏: ```vue <template> <div> <el-button @click="visible = true">打开抽屉</el-button> <my-drawer v-model="visible" title="抽屉标题"> 抽屉内容 </my-drawer> </div> </template> <script> import MyDrawer from './MyDrawer.vue'; export default { components: { MyDrawer, }, data() { return { visible: false, }; }, }; </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值