当前位置:首页 > VUE

vue抽屉组件实现

2026-02-17 00:55:25VUE

Vue 抽屉组件实现

使用 Element UI 实现抽屉组件

安装 Element UI 库:

npm install element-ui

在 main.js 中引入 Element UI:

import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';

Vue.use(ElementUI);

在组件中使用抽屉:

vue抽屉组件实现

<template>
  <div>
    <el-button @click="drawer = true" type="primary">打开抽屉</el-button>
    <el-drawer
      title="标题"
      :visible.sync="drawer"
      direction="rtl"
      size="50%">
      <span>抽屉内容</span>
    </el-drawer>
  </div>
</template>

<script>
export default {
  data() {
    return {
      drawer: false
    }
  }
}
</script>

使用 Ant Design Vue 实现抽屉组件

安装 Ant Design Vue:

npm install ant-design-vue

在 main.js 中引入 Ant Design Vue:

vue抽屉组件实现

import Vue from 'vue';
import Antd from 'ant-design-vue';
import 'ant-design-vue/dist/antd.css';

Vue.use(Antd);

在组件中使用抽屉:

<template>
  <div>
    <a-button type="primary" @click="showDrawer">打开抽屉</a-button>
    <a-drawer
      title="标题"
      placement="right"
      :closable="false"
      :visible="visible"
      @close="onClose"
      width="50%">
      <p>抽屉内容</p>
    </a-drawer>
  </div>
</template>

<script>
export default {
  data() {
    return {
      visible: false
    }
  },
  methods: {
    showDrawer() {
      this.visible = true
    },
    onClose() {
      this.visible = false
    }
  }
}
</script>

自定义实现抽屉组件

创建自定义抽屉组件 Drawer.vue:

<template>
  <transition name="fade">
    <div class="drawer" v-if="visible">
      <div class="drawer-mask" @click="close"></div>
      <div class="drawer-content" :style="{width: width}">
        <div class="drawer-header">
          <h3>{{title}}</h3>
          <button @click="close">×</button>
        </div>
        <div class="drawer-body">
          <slot></slot>
        </div>
      </div>
    </div>
  </transition>
</template>

<script>
export default {
  props: {
    visible: Boolean,
    title: String,
    width: {
      type: String,
      default: '30%'
    }
  },
  methods: {
    close() {
      this.$emit('update:visible', false)
    }
  }
}
</script>

<style scoped>
.drawer {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 1000;
}

.drawer-mask {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: rgba(0, 0, 0, 0.5);
}

.drawer-content {
  position: absolute;
  right: 0;
  top: 0;
  bottom: 0;
  background-color: #fff;
  box-shadow: -2px 0 8px rgba(0, 0, 0, 0.15);
}

.drawer-header {
  padding: 16px;
  border-bottom: 1px solid #f0f0f0;
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.drawer-body {
  padding: 16px;
}

.fade-enter-active, .fade-leave-active {
  transition: opacity .5s;
}

.fade-enter, .fade-leave-to {
  opacity: 0;
}
</style>

使用自定义抽屉组件:

<template>
  <div>
    <button @click="showDrawer">打开抽屉</button>
    <Drawer 
      v-model="visible" 
      title="自定义抽屉" 
      width="40%">
      <p>这是自定义抽屉内容</p>
    </Drawer>
  </div>
</template>

<script>
import Drawer from './Drawer.vue'

export default {
  components: { Drawer },
  data() {
    return {
      visible: false
    }
  },
  methods: {
    showDrawer() {
      this.visible = true
    }
  }
}
</script>

抽屉组件的关键特性

  1. 动画效果:使用 Vue 的 transition 组件实现平滑的打开和关闭动画
  2. 遮罩层:点击遮罩层可以关闭抽屉,提升用户体验
  3. 自定义宽度:通过 props 可以灵活设置抽屉的宽度
  4. 插槽支持:通过 slot 可以插入任意内容
  5. 双向绑定:使用 v-model 简化状态管理

标签: 抽屉组件
分享给朋友:

相关文章

vue实现广告组件

vue实现广告组件

Vue 实现广告组件的核心方法 数据驱动的广告内容渲染 通过 props 接收广告数据(如图片URL、跳转链接等),使用 v-bind 动态绑定属性。典型结构包含 <a> 标签嵌套 <…

uniapp如何将底部导航组件化

uniapp如何将底部导航组件化

在 uniapp 中将底部导航组件化 将底部导航组件化可以提高代码复用性和维护性。以下是具体实现方法: 创建自定义底部导航组件 新建一个组件文件,例如 tab-bar.vue,放置在 compon…

vue实现组件切换

vue实现组件切换

Vue 组件切换的实现方法 在 Vue 中实现组件切换有多种方式,以下是几种常见的方法: 动态组件 使用 Vue 内置的 <component> 元素和 is 属性可以动态切换组件:…

vue实现高阶组件

vue实现高阶组件

Vue 高阶组件实现方法 高阶组件(HOC)是一种复用组件逻辑的模式,通过函数包裹组件并返回新组件实现。Vue 中可通过以下方式实现: 使用 render 函数 通过函数接收组件选项并返回新组件选项…

vue 实现通用组件

vue 实现通用组件

Vue 实现通用组件的方法 封装可复用的组件 将通用功能抽象为独立组件,通过props接收外部数据,通过events与父组件通信。例如封装按钮、输入框、弹窗等基础组件。 使用插槽增强灵活性 通过默认…

vue缩放组件实现

vue缩放组件实现

Vue 缩放组件实现方法 基于 CSS transform 实现缩放 通过 CSS 的 transform: scale() 属性实现基础缩放效果。在 Vue 中动态绑定 scale 值,结合鼠标事…