Vue3 elementPlus 修改el-drawer 封装buttomSelector

Vue3 elementPlus 修改el-drawer css

elementPlus的抽屉组件,对于移动端的样式很多的功能不太满足。所以我封装了一个底部选择的组件,用于移动端的一些信息修改或者选择。

这边对与样式的修改主要是有个遇到的问题顺便这边讲一下。

一般修改样式我们都会给每个页面的css加上scoped。但是这样有时候修改elementPlus的样式的时候会不生效。(有时候生效的,比如elementPlus 的输入框的 .el-textarea__inner )

解决方法:给对应的elementPlus组件加上一个custom-class 然后样式修改以这个为父组件进行修改即可.一般命名可以有规则的复杂一点,这样避免重复和污染其他组件

​
<el-drawer custom-class="selectorComponentContainer" v-model="showDrawer"  :direction="'btt'">
    <template #default>
      <div class="itemContainer">
        <div v-for="(item,index) in selectList" class="item" @click="changeSelect(index)">
          {{item}}
        </div>
        <div class="divider"/>
        <div class="item" @click="closeView">
          取消
        </div>
      </div>
    </template>
  </el-drawer>
<style >
.selectorComponentContainer{
  width: 100%;
  max-height: 50%;
  height: v-bind(drawerHeight) !important;
}
.selectorComponentContainer .el-drawer__header {
  display: none;
}
.selectorComponentContainer .el-drawer__body {
  background-color: #252525;
  padding: 0;
}
.selectorComponentContainer .el-drawer__body::-webkit-scrollbar {
  width: 0 !important;
  height: 0px !important;
}
</style>

​

然后讲一下这个组件的封装过程。(后面贴上组件代码和使用代码)

  1. 首先查看el-drawer的组成部分。整体由一个el-overlay包裹在最外层

  2. 然后里面有header,body,footer三部分组成

  3. 这边不需要footer和header,我们自己封装一个列表即可

  4. 所以利用css 将header不显示。footer没有传参数默认不显示,我们就不用处理

  5. 我们封装自己的列表一个是外面传进来的数组,一个是取消按钮。即可

  6. 为了界面美观我设定了最大高度50%,然后组件的高度由里面的数组的数量控制。

  7. 然后响应界面显示,监听了抽屉组件的显示变量。响应给外面的调用。

  8. 最后就是选择,然后响应给外面的调用。(传出选中的index就好了)

    <template>
      <el-drawer custom-class="selectorComponentContainer" v-model="showDrawer"  :direction="'btt'">
        <template #default>
          <div class="itemContainer">
            <div v-for="(item,index) in selectList" class="item" @click="changeSelect(index)">
              {{item}}
            </div>
            <div class="divider"/>
            <div class="item" @click="closeView">
              取消
            </div>
          </div>
        </template>
      </el-drawer>
    
    </template>
    
    <script setup>
    import {ref, toRefs, watch} from "vue";
    
    const emit = defineEmits(['changeSelect',"closeSelector"])
    const props = defineProps(["selectList","selectIndex","title"])
    const {selectIndex,selectList,title} = toRefs(props)
    
    const drawerHeight =  (selectList.value.length+1)*50+10+"px";
    console.log(drawerHeight)
    
    const showDrawer = ref(true)
    watch(showDrawer,()=>{
      closeView()
    })
    const closeView = () => {
      emit('closeSelector')
    }
    const changeSelect = (index) => {
      emit('changeSelect',index)
      closeView()
    }
    </script>
    
    <style >
    .selectorComponentContainer{
      width: 100%;
      max-height: 50%;
      height: v-bind(drawerHeight) !important;
    }
    .selectorComponentContainer .el-drawer__header {
      display: none;
    }
    .selectorComponentContainer .el-drawer__body {
      background-color: #252525;
      padding: 0;
    }
    .selectorComponentContainer .el-drawer__body::-webkit-scrollbar {
      width: 0 !important;
      height: 0px !important;
    }
    </style>
    <style scoped>
    .itemContainer{
      width: 100%;
    }
    .item{
      color: white;
      text-align: center;
      line-height: 50px;
      height: 50px;
      background-color: #2d2e30;
      border-top: #252525 2px solid;
    }
    .divider{
      width: 100%;
      height: 10px;
    }
    </style>
    
    
    //----------外面组件的调用-------//
    <buttom-selector
            v-if="showSelector"                        //控制控件显示变量
            @closeSelector="changeShowSelector"        //关闭控件的函数
            @changeSelect="changeSelect"               //选中返回的函数
            :selectList="['女','男']"                  //传进去显示的列表
        />
    

    好的。谢谢关注

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以按照以下步骤使用 Element Plus 封装 el-drawer 组件: 1. 安装 Element Plus 在项目中安装 Element Plus,可以使用 npm 或 yarn: ``` npm install element-plus --save ``` 或 ``` yarn add element-plus ``` 2. 创建 Drawer 组件 在 components 目录下创建 Drawer.vue 文件,定义 Drawer 组件的模板和样式: ```html <template> <el-drawer :visible="visible" :direction="direction" :size="size" :before-close="beforeClose" :close-on-click-modal="closeOnClickModal" :close-on-press-escape="closeOnPressEscape" :lock-scroll="lockScroll" :modal="modal" :custom-class="customClass" :with-header="withHeader" :with-footer="withFooter" :show-close="showClose" > <div class="drawer-body"> <slot></slot> </div> </el-drawer> </template> <script> import { defineComponent } from 'vue'; export default defineComponent({ name: 'Drawer', props: { visible: { type: Boolean, default: false, }, direction: { type: String, default: 'rtl', }, size: { type: String, default: '30%', }, beforeClose: Function, closeOnClickModal: { type: Boolean, default: true, }, closeOnPressEscape: { type: Boolean, default: true, }, lockScroll: { type: Boolean, default: true, }, modal: { type: Boolean, default: true, }, customClass: String, withHeader: { type: Boolean, default: true, }, withFooter: { type: Boolean, default: true, }, showClose: { type: Boolean, default: true, }, }, }); </script> <style> .drawer-body { padding: 20px; } </style> ``` 3. 注册 Drawer 组件 在 main.js 中注册 Drawer 组件: ```js import { createApp } from 'vue'; import ElementPlus from 'element-plus'; import 'element-plus/lib/theme-chalk/index.css'; import App from './App.vue'; import Drawer from './components/Drawer.vue'; const app = createApp(App); app.use(ElementPlus); app.component('Drawer', Drawer); app.mount('#app'); ``` 4. 使用 Drawer 组件 在需要使用 Drawer 组件的页面中引入: ```html <template> <div> <el-button @click="openDrawer">打开 Drawer</el-button> <drawer :visible="visible" @update:visible="visible = $event"> <h3 slot="title">这是标题</h3> <p>这是内容</p> </drawer> </div> </template> <script> import { defineComponent, ref } from 'vue'; export default defineComponent({ name: 'App', components: { Drawer: () => import('./components/Drawer.vue'), }, setup() { const visible = ref(false); function openDrawer() { visible.value = true; } return { visible, openDrawer, }; }, }); </script> ``` 这样就可以使用 Element Plus 封装Drawer 组件了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值