详细分析Element中的Drawer(附Demo)

目录

  • 前言
  • 1. 基本知识
  • 2. Demo
    • 2.1 基本用法
    • 2.2 不同方向
    • 2.3 自定义大小
    • 2.4 嵌入表单
    • 2.5 嵌套抽屉
  • 3. 实战
  • 4. Element Plus(Drawer)

前言

对于该组件针对Vue2比较多,而Element Plus中的Drawer针对Vue3比较多

此处的Demo主要偏向Vue2
后续的Element Plus 偏向Vue3

1. 基本知识

Drawer 组件可以用于从屏幕的边缘滑入一个面板,用来显示额外的内容而不会离开当前页面视图

主要属性如下:

  • visible:是否显示抽屉,Boolean 类型,默认值为 false
  • direction:抽屉滑出的方向,可以是 ‘ltr’(左侧滑出)、‘rtl’(右侧滑出)、‘ttb’(顶部滑出)、‘btt’(底部滑出),默认值为 ‘rtl’
  • size:抽屉的大小,可以是具体的像素值或者百分比,默认值为 ‘30%’
  • title:抽屉的标题,String 类型
  • append-to-body:是否将 Drawer 添加到 body 元素上,Boolean 类型,默认值为 false

事件:

  • open:抽屉打开时触发的事件
  • close:抽屉关闭时触发的事件

2. Demo

更多的Demo如下:

2.1 基本用法

<template>
  <div>
    <el-button type="primary" @click="drawerVisible = true">打开抽屉</el-button>
    <el-drawer
      title="基本抽屉"
      :visible.sync="drawerVisible"
      @close="handleClose">
      <span>这是一个基本的抽屉内容。</span>
    </el-drawer>
  </div>
</template>

<script>
export default {
  data() {
    return {
      drawerVisible: false
    };
  },
  methods: {
    handleClose() {
      console.log('抽屉已关闭');
    }
  }
};
</script>

2.2 不同方向

<template>
  <div>
    <el-button type="primary" @click="leftDrawer = true">左侧滑出</el-button>
    <el-button type="primary" @click="rightDrawer = true">右侧滑出</el-button>
    <el-button type="primary" @click="topDrawer = true">顶部滑出</el-button>
    <el-button type="primary" @click="bottomDrawer = true">底部滑出</el-button>

    <el-drawer
      title="左侧抽屉"
      :visible.sync="leftDrawer"
      direction="ltr"
      @close="handleClose('leftDrawer')">
      <span>左侧滑出的抽屉内容。</span>
    </el-drawer>

    <el-drawer
      title="右侧抽屉"
      :visible.sync="rightDrawer"
      direction="rtl"
      @close="handleClose('rightDrawer')">
      <span>右侧滑出的抽屉内容。</span>
    </el-drawer>

    <el-drawer
      title="顶部抽屉"
      :visible.sync="topDrawer"
      direction="ttb"
      @close="handleClose('topDrawer')">
      <span>顶部滑出的抽屉内容。</span>
    </el-drawer>

    <el-drawer
      title="底部抽屉"
      :visible.sync="bottomDrawer"
      direction="btt"
      @close="handleClose('bottomDrawer')">
      <span>底部滑出的抽屉内容。</span>
    </el-drawer>
  </div>
</template>

<script>
export default {
  data() {
    return {
      leftDrawer: false,
      rightDrawer: false,
      topDrawer: false,
      bottomDrawer: false
    };
  },
  methods: {
    handleClose(drawer) {
      this[drawer] = false;
      console.log(`${drawer} 抽屉已关闭`);
    }
  }
};
</script>

2.3 自定义大小

<template>
  <div>
    <el-button type="primary" @click="smallDrawer = true">小抽屉</el-button>
    <el-button type="primary" @click="largeDrawer = true">大抽屉</el-button>

    <el-drawer
      title="小抽屉"
      :visible.sync="smallDrawer"
      size="20%"
      @close="handleClose('smallDrawer')">
      <span>这是一个小抽屉。</span>
    </el-drawer>

    <el-drawer
      title="大抽屉"
      :visible.sync="largeDrawer"
      size="70%"
      @close="handleClose('largeDrawer')">
      <span>这是一个大抽屉。</span>
    </el-drawer>
  </div>
</template>

<script>
export default {
  data() {
    return {
      smallDrawer: false,
      largeDrawer: false
    };
  },
  methods: {
    handleClose(drawer) {
      this[drawer] = false;
      console.log(`${drawer} 抽屉已关闭`);
    }
  }
};
</script>

2.4 嵌入表单

<template>
  <div>
    <el-button type="primary" @click="drawerVisible = true">打开表单抽屉</el-button>
    <el-drawer
      title="表单抽屉"
      :visible.sync="drawerVisible"
      size="50%"
      @close="handleClose">
      <el-form ref="form" :model="form" label-width="80px">
        <el-form-item label="用户名">
          <el-input v-model="form.username"></el-input>
        </el-form-item>
        <el-form-item label="邮箱">
          <el-input v-model="form.email"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="submitForm">提交</el-button>
        </el-form-item>
      </el-form>
    </el-drawer>
  </div>
</template>

<script>
export default {
  data() {
    return {
      drawerVisible: false,
      form: {
        username: '',
        email: ''
      }
    };
  },
  methods: {
    handleClose() {
      console.log('表单抽屉已关闭');
    },
    submitForm() {
      this.$refs.form.validate(valid => {
        if (valid) {
          console.log('提交成功', this.form);
          this.drawerVisible = false;
        } else {
          console.error('表单验证失败');
        }
      });
    }
  }
};
</script>

2.5 嵌套抽屉

<template>
  <div>
    <el-button type="primary" @click="outerDrawer = true">打开外层抽屉</el-button>

    <el-drawer
      title="外层抽屉"
      :visible.sync="outerDrawer"
      size="50%"
      @close="handleClose('outerDrawer')">
      <span>这是外层抽屉的内容。</span>
      <el-button type="primary" @click="innerDrawer = true">打开内层抽屉</el-button>
      
      <el-drawer
        title="内层抽屉"
        :visible.sync="innerDrawer"
        size="30%"
        @close="handleClose('innerDrawer')">
        <span>这是内层抽屉的内容。</span>
      </el-drawer>
    </el-drawer>
  </div>
</template>

<script>
export default {
  data() {
    return {
      outerDrawer: false,
      innerDrawer: false
    };
  },
  methods: {
    handleClose(drawer) {
      this[drawer] = false;
      console.log(`${drawer} 抽屉已关闭`);
    }
  }
};
</script>

3. 实战

对于实战中的Demo(部分)

<template>
  <basic-container>
    <avue-crud :option="option"
               :table-loading="loading"
               :data="data"
               ref="crud"
               v-model="form"
               :permission="permissionList"
               :before-open="beforeOpen"
               @row-del="rowDel"
               @row-update="rowUpdate"
               @row-save="rowSave"
               @search-change="searchChange"
               @search-reset="searchReset"
               @selection-change="selectionChange"
               @current-change="currentChange"
               @size-change="sizeChange"
               @refresh-change="refreshChange"
               @on-load="onLoad"
               @tree-load="treeLoad">
      <template slot-scope="{row}" slot="menu">
        <el-button type="text"
                   icon="el-icon-setting"
                   size="small"
                   v-if="permission.api_scope_setting"
                   plain
                   style="border: 0;background-color: transparent !important;"
                   @click.stop="handleDataScope(row)">权限配置
        </el-button>
      </template>
      <template slot-scope="{row}" slot="source">
        <div style="text-align:center">
          <i :class="row.source"/>
        </div>
      </template>
    </avue-crud>
    <el-drawer :title="`[${scopeMenuName}] 接口权限配置`" :visible.sync="drawerVisible" :direction="direction"
               append-to-body
               :before-close="handleDrawerClose" size="1000px">
      <basic-container>
        <avue-crud :option="optionScope"
                   :data="dataScope"
                   :page="pageScope"
                   v-model="formScope"
                   :table-loading="scopeLoading"
                   ref="crudScope"
                   @row-del="rowDelScope"
                   @row-update="rowUpdateScope"
                   @row-save="rowSaveScope"
                   :before-open="beforeOpenScope"
                   @search-change="searchChangeScope"
                   @search-reset="searchResetScope"
                   @selection-change="selectionChangeScope"
                   @current-change="currentChangeScope"
                   @size-change="sizeChangeScope"
                   @on-load="onLoadScope">
          <template slot="menuLeft">
            <el-button type="danger"
                       size="small"
                       icon="el-icon-delete"
                       plain
                       @click="handleDeleteScope">删 除
            </el-button>
          </template>
          <template slot-scope="{row}"
                    slot="scopeType">
            <el-tag>{{row.scopeTypeName}}</el-tag>
          </template>
        </avue-crud>
      </basic-container>
    </el-drawer>
  </basic-container>
</template>

截图如下:

在这里插入图片描述

对应的弹窗风格如下:

4. Element Plus(Drawer)

既然阐述到Element 的Drawer,那么看看Element Plus中的有啥差异

基本用法的对比:

<template>
  <div>
    <el-button type="primary" @click="drawerVisible = true">打开抽屉</el-button>
    <el-drawer
      title="基本抽屉"
      :visible.sync="drawerVisible"
      @close="handleClose">
      <span>这是一个基本的抽屉内容。</span>
    </el-drawer>
  </div>
</template>

<script>
export default {
  data() {
    return {
      drawerVisible: false
    };
  },
  methods: {
    handleClose() {
      console.log('抽屉已关闭');
    }
  }
};
</script>

Element Plus:

<template>
  <div>
    <el-button type="primary" @click="drawerVisible = true">打开抽屉</el-button>
    <el-drawer
      title="基本抽屉"
      :model-value="drawerVisible"
      @close="handleClose">
      <span>这是一个基本的抽屉内容。</span>
    </el-drawer>
  </div>
</template>

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

export default {
  setup() {
    const drawerVisible = ref(false);

    const handleClose = () => {
      console.log('抽屉已关闭');
    };

    return {
      drawerVisible,
      handleClose
    };
  }
};
</script>

差异如下:

绑定可见性

  • Element 使用 :visible.sync 来绑定可见性状态。
  • Element Plus 使用 :model-value 来绑定可见性状态。

API 设计

  • Element 是基于 Vue 2 的选项式 API。
  • Element Plus 是基于 Vue 3 的组合式 API

更多的差异推荐如下:

  1. 详细分析Vue3中组合式API(附Demo)
  2. 详细分析Vue3中的props用法(父传子)
  3. 详细分析Vue3中的emit用法(子传父)
  4. 详细分析Vue3中的defineEmits基本知识(子传父)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/655919.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【学习笔记】计算机组成原理(七)

指令系统 文章目录 指令系统7.1 机器指令7.1.1 指令的一般格式7.1.2 指令字长 7.2 操作数类型和操作类型7.2.1 操作数类型7.2.2 数据在存储器中的存放方式7.2.3 操作类型 7.3 寻址方式7.3.1 指令寻址7.3.1.1 顺序寻址7.3.1.2 跳跃寻址 7.3.2 数据寻址7.3.2.1 立即寻址7.3.2.2 直…

【数据结构与算法】七大排序算法(上)

【数据结构与算法】七大排序算法(上) &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;数据结构与算法&#x1f345; &#x1f33c;文章目录&#x1f33c; 1. 排序的概念及应用 1.1 排序的概念 1.2 排序的应用 1.3 常见排序算法 2. 常…

Spring MVC+mybatis 项目入门:旅游网(二) dispatcher与controller与Spring MVC

个人博客&#xff1a;Spring MVCmybatis 项目入门:旅游网&#xff08;二&#xff09;dispatcher与controller与Spring MVC | iwtss blog 先看这个&#xff01; 这是18年的文章&#xff0c;回收站里恢复的&#xff0c;现阶段看基本是没有参考意义的&#xff0c;技术老旧脱离时代…

中国上市企业行业异质性数据分析

数据简介&#xff1a;企业行业异质性数据是指不同行业的企业在运营、管理、财务等方面的差异性数据。这些数据可以反映不同行业企业的特点、优势和劣势&#xff0c;以及行业间的异质性对企业经营和投资的影响。通过对企业行业异质性数据的分析&#xff0c;投资者可以更好地了解…

杀死那个进程

一、场景 eclipse在启动tomcat时&#xff0c;出现端口被占用的情况。我寻思着“任务管理器”没出现相应程序在跑啊。 1.1问题&#xff1a;端口和进程的关系 端口和进程之间存在着一种关系&#xff0c;端口是一个逻辑概念&#xff0c;它用于标识网络通信中的一个终点&#xff0…

基于Java实现震中附近风景区预警可视化分析实践

目录 前言 一、空间数据说明 1、表结构信息展示 2、空间范围查询 二、Java后台开发实现 1、模型层设计与实现 2、控制层设计与实现 三、Leaflet地图开发 1、地震震中位置展示 2、百公里风景区列表展示 3、风景区列表展示 4、附近风景区展示 四、总结 前言 地震这类…

为表格添加背景色:\rowcolor, \columncolor,\cellcolor

设置行的背景 \rowcolor 是 LaTeX 中用于设置表格行的背景色的命令。它可以使表格更加美观和易于阅读。rowcolor 命令通常与 colortbl 宏包一起使用。 语法如下&#xff1a; \rowcolor{<color>}其中 表示要设置的背景色&#xff0c;可以是预定义的颜色名称&#xff08…

C++算术运算和自增自减运算

一 引言 表示运算的符号称为运算符。 算术运算&#xff1b; 比较运算&#xff1b; 逻辑运算&#xff1b; 位运算&#xff1b; 1 算术运算 算术运算包括加、减、乘、除、乘方、指数、对数、三角函数、求余函数&#xff0c;这些都是算术运算。 C中用、-、*、/、%分别表示加、减…

Redis 中 List 数据结构详解

目录 List 用法 1. 增 2. 删 3. 查 内部编码 应用场景 前言 Redis 中的 List 和 Set 数据结构各有特点&#xff0c;适用于不同的应用场景。List 提供了有序的列表结构&#xff0c;适合用于消息队列和任务列表等场景&#xff1b;Set 提供了无序且不重复的集合结构&#…

9.Docker网络

文章目录 1、Docker网络简介2、常用基本命令3、网络模式对比举例3.1、bridge模式3.2、host模式3.3、none模式3.4、container模式3.5、自定义网络 1、Docker网络简介 作用&#xff1a; 容器间的互联和通信以及端口映射容器IP变动时候可以通过服务名直接进行网络通信而不受到影…

module ‘plotting‘ has no attribute ‘EpisodeStats‘

plotting.py 的版本不同&#xff0c;可以使用下列版本 reinforcement-learning/lib/plotting.py at master dennybritz/reinforcement-learning GitHubImplementation of Reinforcement Learning Algorithms. Python, OpenAI Gym, Tensorflow. Exercises and Solutions to a…

机器人运动轨迹学习——GMM/GMR算法

机器人运动轨迹学习——GMM/GMR算法 前置知识 GMM的英文全称为&#xff1a;Gaussian mixture model&#xff0c;即高斯混合模型&#xff0c;也就是说&#xff0c;它是由多个高斯模型进行混合的结果&#xff1a;当然&#xff0c;这里的混合是带有权重概念的。 一维高斯分布 GMM中…

「Python Socket超能力:网络世界的隐形斗篷!」

Hi&#xff0c;我是阿佑&#xff0c;今天将带领大家揭开Python Socket编程的神秘面纱&#xff0c;赋予我们的网络应用隐形斗篷般的超能力&#xff01; 深入探讨Socket编程的革命性力量&#xff0c;教你如何用Python的Socket模块来构建强大的网络应用。从简单的HTTP服务器到复杂…

go语言初识别(五)

本博客内容涉及到&#xff1a;切片 切片 1. 切片的概念 首先先对数组进行一下回顾&#xff1a; 数组定义完&#xff0c;长度是固定的&#xff0c;例如&#xff1a; var num [5]int [5]int{1,2,3,4,5}定义的num数组长度是5&#xff0c;表示只能存储5个整形数字&#xff0c…

【problem】解决EasyExcel导出日期数据显示为#####问题

前言 在使用EasyExcel进行数据导出时&#xff0c;你可能遇到日期或其他数据在Excel中显示为“#######”的情况&#xff0c;这通常是因为列宽不足以展示单元格内的全部内容。本文将指导你如何通过简单的步骤解决这一问题&#xff0c;并确保导出的Excel文件自动调整列宽或直接指…

调整图片和表格尺寸的命令:resizebox

\resizebox 是 LaTeX 中的一个命令&#xff0c;用于调整插入的内容&#xff08;如图像、表格、文本等&#xff09;的大小。它的语法如下&#xff1a; \resizebox{<width>}{<height>}{<content>}其中&#xff1a; <width> 和 <height> 分别表示…

Niantic利用Meta Llama让数字生物栩栩如生

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

代码随想录——平衡二叉树(Leetcode110)

题目链接 后序遍历高度&#xff0c;高度判断是否平衡 前序遍历深度 递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* …

关于c++的通过cin.get()维持黑框的思考

1.前言 由于本科没有学过c语言&#xff0c;研究生阶段接触c上手有点困难&#xff0c;今天遇到关于通过cin.get()来让黑框维持的原因。 2.思考 cin.get()维持黑框不消失的原因一言蔽之就是等待输入。等待键盘的输入内容并回车&#xff08;一般是回车&#xff09;后cin.get()才…

Grafana详解

目录 ​编辑 一、Grafana的主要特点 二、Grafana的基本功能 三、Grafana的使用方法 Grafana是一款开源的数据可视化工具&#xff0c;主要用于大规模指标数据的可视化展现。下面将详细介绍Grafana的特点、功能以及基本使用方法。 一、Grafana的主要特点 跨平台性&#xff…