vue3为element的select组件添加底部固定操作列

最近公司老系统准备用vue3重构,其中涉及到选择器新增选项,本来以为就是在选择器旁边加一个新增按钮,心想就不是小case嘛?就开始身体一瘫,开始划水,安心等待UI小姐姐的整体布局。后来实在无聊了打开小姐姐的设计图

select.png

???这是啥???怎么好像大概可能跟我想的不一样啊。揉了揉眼睛再三确认了一下,发现事情果然没有自己想象的那么简单,算了,好男人怎么能辜负小姐姐的一片苦心。埋头就是干呗。

  • 首先想到的就是去看看element官方有没有提供相应的插槽,乘兴而去然后败兴而归,果然element没有让我失望,没有提供。
  • 想着获取当前下拉框的dom节点,在底部新增一个节点,在揪掉了我为数不多的几根头发后觉得此法可行,说干就干,行不行试过才知道。
  1. 首先输出<el-select></el-select>组件的ref看看能不能获取到下拉框的dom元素,突然发现element还是很人性化的,找到了一个popperPaneRef,刚好满足自己的要求

    image.png

     

    2.写底部固定操作列的样式

      const el = document.createElement('div');
      el.className = 'bkp_add_fixed_bottom_select';
      el.style=`
            font-size: 14px;
            font-weight: 500;
            height: 42px;
            display: flex;
            align-items: center;
            justify-content: center;
            cursor: pointer;
            padding-top:4px;
            border-top:1px solid rgb(240 242 245)
      `
      el.innerHTML = `
            <span style="margin-right:8px">
                    <svg class="icon" aria-hidden="true">
                          <use xlink:href="#icon-plus"></use>
                    </svg>
            </span>
            <span>新增</span>
      `;

3.在下拉框展开时添加新增的dom节点

const VisibleChange=(visible)=>{
        if(visible){
                //#region 添加底部操作按钮
                let bkpRef=refSelect.value;
                let popper = bkpRef.popperPaneRef;
                if (!Array.from(popper.children).some(v => v.className === 'bkp_add_fixed_bottom_select')) {
                    ...步骤2相关代码
                    popper.appendChild(el);
                    el.onclick = () => {
                        // 底部按钮的点击事件 点击后想触发的逻辑也可以直接写在这
                        onClickAdd()
                
                        // 以下代码实现点击后弹层隐藏 不需要可以删掉
                        if (tbRef.toggleDropDownVisible) {
                            tbRef.toggleDropDownVisible(false);
                        } 
                        else {
                            tbRef.visible = false;
                        }
                    };
                }
                //#endregion
        }
    }

结尾(附上完整代码)

<template>
    <el-select 
        ref="refSelect"
        placeholder="请选择..."
        @visible-change="VisibleChange"
        :popper-append-to-body="true"
    >
      <el-option
        v-for="item in state.options"
        :key="item.value"
        :label="item.label"
        :value="item.value"
      >
      </el-option>
    </el-select>
</template>

<script setup>
    import { reactive, ref } from "vue-demi";

    const refSelect=ref(null);

    const state=reactive({
        options:[
          {
            value: 'Option1',
            label: 'Option1',
          },
        ]
    })

    //在下拉框展开时添加底部固定项(注意该方法可能随版本更新而不适用)
    const VisibleChange=(visible)=>{
        if(visible){
                //#region 添加底部操作按钮
                let bkpRef=refSelect.value;
                let popper = bkpRef.popperPaneRef;
                if (!Array.from(popper.children).some(v => v.className === 'bkp_add_fixed_bottom_select')) {
                    const el = document.createElement('div');
                    el.className = 'bkp_add_fixed_bottom_select';
                    el.style=`
                          font-size: 14px;
                          font-weight: 500;
                          height: 42px;
                          display: flex;
                          align-items: center;
                          justify-content: center;
                          cursor: pointer;
                          padding-top:4px;
                          border-top:1px solid rgb(240 242 245)
                    `
                    el.innerHTML = `
                          <span style="margin-right:8px">
                                  <svg class="icon" aria-hidden="true">
                                        <use xlink:href="#icon-plus"></use>
                                  </svg>
                           </span>
                          <span>新增</span>
                      `;
                    popper.appendChild(el);
                    el.onclick = () => {
                        // 底部按钮的点击事件 点击后想触发的逻辑也可以直接写在这
                        // onClickAdd();
                
                        // 以下代码实现点击后弹层隐藏 不需要可以删掉
                        if (bkpRef.toggleDropDownVisible) {
                            bkpRef.toggleDropDownVisible(false);
                        } 
                        else {
                            bkpRef.visible = false;
                        }
                    };
                }
                //#endregion
            
        }
    }

</script>

<style lang="scss" scoped>
</style>
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 答:Vue3 中可以使用 element-plus 的 select 组件获取 lable,可以通过以下代码实现:<el-select v-model="value" placeholder="请选择"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> ### 回答2: 在Vue 3中,获取Element Plus Select组件的label,可以通过ref引用和watch监听来实现。首先,需要在Vue组件的data中声明一个ref引用,用来存储Select组件的实例。然后,在mounted生命周期钩子函数中,使用`this.$refs`获取Select组件的实例,并将其赋值给之前声明的ref引用。接下来,可以在watch监听ref引用的变化,在变化时获取Select组件的label。 具体实现步骤如下: 1. 在Vue组件的data中声明一个ref引用,用来存储Select组件的实例: ```javascript data() { return { selectRef: null }; } ``` 2. 在mounted生命周期钩子函数中,使用`this.$refs`获取Select组件的实例,并将其赋值给之前声明的ref引用: ```javascript mounted() { this.selectRef = this.$refs.select; } ``` 3. 使用watch监听ref引用的变化,在变化时获取Select组件的label: ```javascript watch: { selectRef(newVal) { if (newVal) { const label = newVal.label; console.log(label); // 在控制台打印label } } } ``` 总结:通过使用ref引用和watch监听,可以在Vue 3中获取Element Plus Select组件的label。首先,声明一个ref引用来存储Select组件的实例,在mounted生命周期钩子函数中获取实例并赋值给ref引用,然后使用watch监听ref引用的变化,并在变化时获取Select组件的label。 ### 回答3: 要获取 Element Plus Select 组件的 label,可以使用 ref 来引用该组件,并通过 $el 属性访问其 DOM 元素,再通过 querySelector 方法找到 label 元素,最后获取其文本内容。 首先,我们需要在 Vue 组件的 setup 函数中定义一个 ref 引用: ```javascript import { ref } from 'vue'; export default { setup() { const selectRef = ref(null); // 创建 ref 引用 //... return { selectRef }; } } ``` 然后,在模板中使用 ref 引用将 Select 组件与 ref 建立关联: ```html <template> <el-select v-model="selectedValue" ref="selectRef"> <!-- 选项项 --> </el-select> </template> ``` 接下来,在需要获取 label 的地方,可以通过 ref 的 value 属性获取组件的引用,并通过 $el 属性访问其 DOM 元素,使用 querySelector 方法找到 label 元素,最后获取其文本内容: ```javascript import { onMounted } from 'vue'; export default { setup() { //... onMounted(() => { const selectElement = selectRef.value.$el; // 获取 Select 组件的 DOM 元素 const labelElement = selectElement.querySelector('.el-select__label'); // 通过类名找到 label 元素 const label = labelElement.innerText; // 获取 label 元素的文本内容 console.log(label); // 输出 label 的文本内容 }); return { selectRef }; } } ``` 通过以上步骤,我们可以在 Vue 3 的组件中成功获取到 Element Plus Select 组件的 label 值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值