element-ui Drawer抽屉组件封装

本文深入探讨了Vue中自定义抽屉组件的实现细节,包括模板结构、属性配置及事件处理,展示了如何通过props传递数据并响应状态变化,适用于前端开发者理解和应用。

<template> <div class="com"> <el-drawer title="我是标题" :visible.sync="drawer_" :direction="direction"> <span>我来啦! {{task.name}}</span> </el-drawer> </div> </template> <script> export default { props:{ task:{ type:Object, default:()=>{} }, drawer:{ type:Boolean, default:false }, direction:{ type:String, default:'rtl' } }, data(){ return { } }, computed: { drawer_:{ get(){ return this.drawer }, set(v){ this.$emit("changeDrawer",v) } } }, } </script> <style scoped> </style>

调用:

 <task-form @changeDrawer="changeDrawer" :task="taskFormData" :drawer="drawer" :direction="direction"></task-form>
        data() {
            return {
                taskData: [],// 任务数据
                drawer: false,
                direction: 'rtl',
                taskFormData:{}
            }
        },
 
    
        methods: {
            changeDrawer(v){
                this.drawer = v;
            },
    }


 

 

### 3.1 组件封装设计 在 Vue 3 中将 `n-drawer` 封装为可复用组件,应遵循组件化设计原则,确保其具备良好的可配置性、插槽支持和事件通信机制。该封装需参考类似 Element UI抽屉组件结构,提供控制显示、标题、宽度等基础属性,并支持自定义内容与回调方法[^1]。 ### 3.2 基础组件实现 创建一个名为 `ReusableDrawer.vue` 的组件文件,使用 Composition API 构建逻辑: ```vue <template> <n-drawer v-model:show="visible" :title="title" :width="width" :mask-closable="maskClosable" @close="handleClose" > <div class="drawer-content"> <slot></slot> </div> <template #footer> <slot name="footer"></slot> </template> </n-drawer> </template> <script setup> import { defineProps, defineEmits, ref, watch } from 'vue'; const props = defineProps({ modelValue: { type: Boolean, default: false }, title: { type: String, default: '标题' }, width: { type: [String, Number], default: 500 }, maskClosable: { type: Boolean, default: true } }); const emit = defineEmits(['update:modelValue', 'close']); const visible = ref(props.modelValue); watch(() => props.modelValue, (newValue) => { visible.value = newValue; }); watch(visible, (newValue) => { emit('update:modelValue', newValue); }); const handleClose = () => { emit('close'); }; </script> <style scoped> .drawer-content { padding: 16px; } </style> ``` ### 3.3 使用方式与参数传递 在父组件中调用封装后的 `ReusableDrawer`,并传递必要的数据与插槽内容,类似于引用中的 `outter-drawer` 调用方式: ```vue <template> <div> <button @click="openDrawer">打开抽屉</button> <ReusableDrawer v-model:show="drawerVisible" title="公司详情" width="900" @close="onDrawerClose" > <!-- 插槽内容 --> <firm :ruleForm="ruleForm" /> <template #footer> <n-button @click="submitForm">提交</n-button> </template> </ReusableDrawer> </div> </template> <script setup> import { ref } from 'vue'; import ReusableDrawer from './components/ReusableDrawer.vue'; import Firm from './components/Firm.vue'; const drawerVisible = ref(false); const ruleForm = ref({ companyName: '', address: '' }); const openDrawer = () => { drawerVisible.value = true; }; const onDrawerClose = () => { console.log('抽屉已关闭'); }; const submitForm = () => { // 提交逻辑 drawerVisible.value = false; }; </script> ``` ### 3.4 扩展功能建议 为了增强组件的适应性,可以引入以下扩展功能: - **动态加载内容**:通过异步组件或条件渲染提升性能。 - **主题定制支持**:允许传入 `class-name` 或 `theme` 属性以适配不同样式需求。 - **键盘操作支持**:如 ESC 键关闭抽屉等功能。 - **国际化支持**:结合 i18n 实现多语言适配[^1]。 上述实现方式充分考虑了组件的可维护性和扩展性,适用于需要频繁使用抽屉组件的业务场景。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值