我就不信ElementPlus 虚拟化选择器不能复制文本?

前言

某一天,产品突然找到我说:你这个选择下拉框,不太行啊。我一听,垂死病中惊坐起!嗯?!用的原原本本的组件,完完全全辛辛苦苦Ctrl+CCtrl+V来的,都没改多少,你竟然说不太行?你这是质疑我饿了么的能力!我要撸起袖子和你理论理论!%......& %......%......&%......&通过一番激烈的辩论,原来是用户要选择文本,我一听,原来如此,小需求,看我的!欣然答应.....然后发现似乎并不是那么回事.....

尝试了一下,按理说,选这个还是挺容易的来着,尝试了一下,嗯,正常的选择器是可以选择文本的,只是选择的同时,会触发一下菜单,但!这问题不大,又不是不能用,让用户兼容一下就好了~

但!我们组件用的是虚拟选择器,哎呀,好烦呐,根本不想换,换起来好麻烦,虚拟选择器就很难受了,如下,根本选不了.....

找了一圈网上的方案,如点击复制啦~,如选择控制啦~window.getSelection()啦~都挺好,不过对于我这个场景没啥用,感觉elmentplus还没有elment成熟,看来害真得自己来了

尝试

首先,想着是用聚焦,失焦的事件控制一下,失败,控制不了,然后,扫了一遍官方提供的属性.....emmm,好像有一个属性有点用------------ automatic-dropdown 用了一下,嗯?怎么就禁用了?文档里也说的不太详细,具体如下

很好,看不太懂,康康源码吧

搜寻一番后,嗷,大概懂嘞,只要这玩意为true,就不让触发菜单了,嘶...我收回之前的话,好像大有可为? 最后,通过控制该属性的变化,我得到了一个可以复制文本的(基本)完美虚拟选择器~如下

ini 复制代码
<script setup lang="ts">
import { ref } from 'vue'
const initials = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']

const value = ref()
const select = ref()
const options = Array.from({ length: 1000 }).map((_, idx) => ({
  value: `Option ${idx + 1}`,
  label: `${initials[idx % 10]}${idx}`,
}))
const canShowOption = ref(true)
const handelChange = ()=>{
    canShowOption.value = true
}
const handelClick = ()=>{
  if(canShowOption.value){
      canShowOption.value = false
   }
}
</script>

<template>
  <div>
    <!-- <el-button @click="test">1111</el-button> -->
    <el-select-v2
      ref="select"
      v-model="value"
      :options="options"
      @change="handelChange"
      @click="handelClick"
      :automatic-dropdown="canShowOption"
      placeholder="Please select"
      size="large"
    />
  </div>
</template>

为啥说基本完美呢?emmmm,他这个,当选择的值变化的时候,需要双击才能打开下拉菜单,但!我们的用户这么聪明,应该能自己兼容这点小毛病吧?不会吧不会吧,打不开不知道多点几下吗?

完善

行吧,接着改,双击不行,我怎么判断用户是想复制还是想弹菜单啊?今天耶稣来了也......也会告诉我后面的那有个小箭头,就点小箭头下拉,其他的地方继续禁用不就行了?改他!

xml 复制代码
<script setup lang="ts">
import { onMounted, ref } from 'vue'
const initials = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']

const value = ref()
const select = ref()
const options = Array.from({ length: 1000 }).map((_, idx) => ({
  value: `Option ${idx + 1}`,
  label: `${initials[idx % 10]}${idx}`,
}))
const canShowOption = ref(true)
const handelChange = ()=>{
    canShowOption.value = true
}
onMounted(()=>{
  select.value.$el.querySelector('.el-select-v2__suffix').addEventListener('click',()=>{
    if(canShowOption.value){
        canShowOption.value = false
    }
  })
})
</script>

<template>
  <div>
    <!-- <el-button @click="test">1111</el-button> -->
    <el-select-v2
      ref="select"
      v-model="value"
      :options="options"
      @change="handelChange"
      :automatic-dropdown="canShowOption"
      placeholder="Please select"
      size="large"
    />
  </div>
</template>

效果如下

到这基本这个功能就差不多了,本来还准备调用toggleMenu,但是再监听里直接改变量就似乎达到效果了,emmm,感觉是冒泡那片的问题,看看还有一堆需求堆着,算了,下次一定~ 最后感谢各位大佬阅读,指正!

相关推荐
持久的棒棒君3 小时前
npm安装electron下载太慢,导致报错
前端·electron·npm
crary,记忆5 小时前
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
前端·webpack·angular·angular.js
漂流瓶jz6 小时前
让数据"流动"起来!Node.js实现流式渲染/流式传输与背后的HTTP原理
前端·javascript·node.js
SamHou06 小时前
手把手 CSS 盒子模型——从零开始的奶奶级 Web 开发教程2
前端·css·web
我不吃饼干6 小时前
从 Vue3 源码中了解你所不知道的 never
前端·typescript
开航母的李大6 小时前
【中间件】Web服务、消息队列、缓存与微服务治理:Nginx、Kafka、Redis、Nacos 详解
前端·redis·nginx·缓存·微服务·kafka
Bruk.Liu6 小时前
《Minio 分片上传实现(基于Spring Boot)》
前端·spring boot·minio
鱼樱前端7 小时前
Vue3+d3-cloud+d3-scale+d3-scale-chromatic实现词云组件
前端·javascript·vue.js
coding随想7 小时前
JavaScript中的原始值包装类型:让基本类型也能“变身”对象
开发语言·javascript·ecmascript
zhangxingchao7 小时前
Flutter入门:Flutter开发必备Dart基础
前端